理由の説明が必要です:
$test=`expr "hello" : "\([a-z]*\)"`; echo $test
はを出力しますhello
が、
$test=`expr "hello" : "hel"`; echo $test
一致する文字の数を返します。
さらに:
$ test=`expr "hello123there" : ".*o\([0-9]*\)"t`; echo $test
を返すには.*
を指定する必要があります。そうしないと、何も返されません。o
123
答え1
それはmanページにあります。例えば http://ss64.com/bash/expr.html
パターン マッチは、( と ) の間に一致する文字列または null を返します。( と ) が使用されていない場合は、一致する文字数または 0 を返します。
答え2
そういうわけでexpr
一致する表現動作します。
パターンに少なくとも 1 つの正規表現サブ式が含まれている場合[\(...\)]
、後方参照式に一致する文字列\1
が返されます。hello
一致した\([a-z]*\)
ので、返されました。
expr
使用済みブレなので、部分式を示すには\(
and をエスケープする必要があります。 and の使用はBRE ではリテラルとみなされます。\)
(
)
それ以外の場合は、一致した文字の数を取得します。
ではexpr "hello123there" : ".*\([0-9]*\)"t
、空の文字列が返されました。これは正規表現の貪欲さによるものです。最も長い部分文字列が一致します。
*
0 個以上の文字に一致するため、 [0-9]*
0 回一致し、.*
最長の部分文字列に一致しますhello123
。そのため、空の文字列が返されます。
がある場合はperl
、以下をお試しください。
printf "hello123there" | perl -Mre=debugcolor -ne 'print $1 if /.*([0-9]*)t/'
そして:
printf "hello123there" | perl -Mre=debugcolor -ne 'print $1 if /.*o([0-9]*)t/'
違いを確認するために。
変数は常に二重引用符で囲む必要があることに注意してください。変数を二重引用符で囲まないと、スクリプトが窒息したそして、セキュリティホール。