私はさまざまな状況で正規表現に慣れていますが、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パラメータに関する質問について、次のサイトが特に役に立つと思います。