理由の説明が必要です:
$test=`expr "hello" : "\([a-z]*\)"`; echo $test
hello
を出力します。ここで、
$test=`expr "hello" : "hel"`; echo $test
一致する文字数を返します。
そしてまた:
$ test=`expr "hello123there" : ".*o\([0-9]*\)"t`; echo $test
.*
の後に注意してください123
を返すにはo
を指定する必要があります。そうしないと、何も返されません。
これが expr
マッチング式 の仕組みです。
パターンに少なくとも1つの正規表現部分式[\(...\)]
が含まれている場合、後方参照式_\1
_と一致する文字列が返されます。 hello
は\([a-z]*\)
と一致したので、元に戻しました。
expr
used [〜#〜] bre [〜#〜] なので、部分式を示すには_\(
_と_\)
_をエスケープする必要があります。 _(
_および_)
_の使用は、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/'
_
違いを見るために。
変数は常に二重引用符で囲む必要があることに注意してください。変数を引用符で囲まないままにすると、スクリプトが チョーク になり、 セキュリティホール につながる可能性があります。
マニュアルページにあります、E.G。 http://ss64.com/bash/expr.html
パターン一致は、(と)またはnullの間で一致した文字列を返します。 (および)が使用されていない場合、一致した文字数または0を返します。