y=$(expr "$str" : ".*$x" - length "$x")
どなたかこのコードについて説明していただけませんか。私はスクリプト作成の初心者ですが、C++ と Python の経験はあります。実はこの質問は、以前の質問に対するコメントの一部だったのですが、回答が得られていません。
答え1
式expr
は"$str" : ".*$x"
正規表現の一致です。一般的な形式は次のとおりです。
expr STRING : REGEXP
どこREGEXP
にアンカー正規表現REGEX
- 「アンカー」とは、の最初の文字から一致を試みることを意味します。したがって、内部のどこにでもSTRING
一致させるには、アンカーからの開始までのすべての文字を吸い上げるようなものが必要です。$x
$str
.*
$x
結果は一致したパターンの長さです。これには に一致するものすべて.*
と に一致するものすべてが含まれます$x
。つまり
expr "$str" : ".*$x" - length "$x"
$x
内の一致の開始インデックスを返します$str
。一致が見つからない場合は、 の長さを引いた値を返します$x
。たとえば、次のようになります。
$ expr foobarbaz : ".*bar" - length bar
3
$ expr foobar : ".*baz" - length baz
-3
「文字列で使用」している場合でもexpr
、実際には (GNU 基本) 正規表現として解釈されることに注意してください$x
。したがって、英数字以外の文字が含まれている場合は注意してください。