`expr "hello" : "\([az]*\)"` の意味は何ですか?

`expr "hello" : "\([az]*\)"` の意味は何ですか?

理由の説明が必要です:

$test=`expr "hello" : "\([a-z]*\)"`; echo $test

はを出力しますhelloが、

$test=`expr "hello" : "hel"`; echo $test

一致する文字の数を返します。

さらに:

$ test=`expr "hello123there" : ".*o\([0-9]*\)"t`; echo $test

を返すには.*を指定する必要があります。そうしないと、何も返されません。o123

答え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/'

違いを確認するために。


変数は常に二重引用符で囲む必要があることに注意してください。変数を二重引用符で囲まないと、スクリプトが窒息したそして、セキュリティホール

関連情報