web-dev-qa-db-ja.com

OR `expr match`内

なぜこれが一致しないのか混乱しています:

expr match Unauthenticated123 '^(Unauthenticated|Authenticated).*'

0を出力します。

6
stracktracer

コマンドは次のようになります。

expr match Unauthenticated123 'Unauthenticated\|Authenticated'

文字数を一致させたい場合。

文字列(非認証)の一部を返すには、次のように使用します。

expr match Unauthenticated123 '\(Unauthenticated\|Authenticated\)'

info coreutils 'expr invocation'から:

 `STRING:REGEX '
パターンマッチングを実行します。引数は文字列
に変換され、2番目の引数は(基本、la GNU `grep ')
正規表現であり、` ^ '暗黙的に先頭に追加されます。最初の
引数は、この正規表現に対して照合されます。
 
照合が成功し、REGEXが `\('および` \) 'を使用する場合、 `: '
式は、
サブ式と一致したSTRINGの部分を返します。それ以外の場合は、一致した文字数
を返します。
 
一致した場合失敗した場合、「:」演算子は、
「\( 'and `\)」がREGEXで使用されている場合はnull文字列を返し、そうでない場合は0。
 
最初の` \( ... \) 'のペアは戻り値に関連しています。
追加のペアは、正規表現
式の演算子をグループ化する場合にのみ意味があります。
 
正規表現、 `\ + '、` \?'、および `\ | 'は、それぞれ1つ以上、0個または1個、または分離文字と一致する演算子
ですe 
代替案。 SunOSおよびその他の「expr」は、これらを通常の
文字として扱います。 (POSIXではどちらの動作も可能です。)*注正規表現
式ライブラリ:(regex)Top、正規表現
構文の詳細。いくつかの例は* noteの例にありますexpr ::。
の例
6
Lambert

matchと_\|_の両方がGNU拡張(および_:_(match標準と同等)の動作)であることに注意してください。パターンは_^_で始まりますが、実装によって異なります。通常、次のようにします。

_expr " $string" : " Authenticated" '|' " $string" : " Unauthenticated"
_

先頭のスペースは、_$string_で始まる、またはexpr演算子である_-_の値の問題を回避するためのものですが、一致する文字数に1を追加します。

GNU exprを使用すると、次のように記述できます。

_expr + "$string" : 'Authenticated\|Unauthenticated'
_

_+_は、expr演算子であっても、_$string_を強制的に文字列として解釈します。 expr正規表現は、代替演算子を持たない基本的な正規表現です(_|_は特別ではありません)。 GNU実装では、拡張機能としては_\|_として実装されています。

_$string_がAuthenticatedまたはUnauthenticatedで始まるかどうかを確認するだけの場合は、以下を使用することをお勧めします。

_case $string in
  (Authenticated* | Unauthenticated*) do-something
esac
_
5

$ expr match "Unauthenticated123" '^\(Unauthenticated\|Authenticated\).*'かっことパイプを\でエスケープする必要があります。

2
netmonk