出力

出力

私はさまざまな状況で正規表現に慣れていますが、bash部分文字列の一致は私を混乱させます。誰かが私にそれを説明できますか?可能であれば、いくつかの例を挙げる必要がありますか? Googleで見つけた例は、非常に単純で非常に一般的な(制限されている場合)正規表現の一致を示唆していますが、実際の状況で使用しようとすると決して機能しません。私が理解したように、部分文字列の一致は次のように機能するはずです。

result=${string##pattern}

「pattern」と一致する「string」の中で最も長い部分文字列が最初から検索されます。 「文字列」から対応する一致を削除し、残りを「結果」に入れます。ただし、次の点を考慮してください。

temp=${myvar##[^0-9]*} && echo $temp

私が知る限り、私のパターンは「ゼロ以上の数字以外の文字」と一致する必要があります。つまり、文字列の先頭で最も長い一致です。それでは、例を挙げましょう。

myvar=my_file_123_45.txt

「my_file_」文字が一致すると予想する必要があります。これは、「文字列」の先頭から始まる数字ではなく、文字の最長の組み合わせです。代わりに返された結果は空です!すべてが一致します!除外された番号はどうなりますか? ! gedit(正規表現エンジンの検索と置換を使用)とLabviewの正規表現ツールでパターンを一致させる

pattern=^[^0-9]*

私はこれが同じだと思い、その結果は私が期待していた 'my_file_'と一致します。バッシュは何が違うのですか?

答え1

regexes.代わりに、Bash代替マッチングは使用されず、wildcard expansion###%%%と一緒に使用され、どちらの方向でも最短一致と最長一致を確認する必要があります。

数字ではなく先行文字を取得する特定の状況では、次の戦略を使用できます。

echo "${myVar%%[0-9]*}"; # delete upto the leftmost digit starting from right

出力

my_file_

http://www.tldp.org/LDP/abs/html/parameter-substitution.htmlすべてのBashパラメータに関する質問について、次のサイトが特に役に立つと思います。

関連情報