web-dev-qa-db-ja.com

ʻexpr "hello"の意味: "\([a-z] * \)" `?

理由の説明が必要です:

$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を指定する必要があります。そうしないと、何も返されません。

1
夢のの夢

これが 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/'
_

違いを見るために。


変数は常に二重引用符で囲む必要があることに注意してください。変数を引用符で囲まないままにすると、スクリプトが チョーク になり、 セキュリティホール につながる可能性があります。

1
cuonglm

マニュアルページにあります、E.G。 http://ss64.com/bash/expr.html

パターン一致は、(と)またはnullの間で一致した文字列を返します。 (および)が使用されていない場合、一致した文字数または0を返します。

2
brendan