メタ文字に対してbash正規表現が失敗するのはなぜですか? [コピー]

メタ文字に対してbash正規表現が失敗するのはなぜですか? [コピー]

入力ファイル名がname.json形式であることを確認するためにbashスクリプトを実行しようとしています。 bashのregxは動作しませんが、grepでは動作します。

文書t1.sh

echo "$1"
regx="^[\w\d-]+[.]json$"
echo $regx
[[ $1 =~ $regx ]] && echo "match" || echo "No Match"
echo $1 | grep -P $regx
test=$(echo $1 | grep -P $regx)
[[ -z $test ]] && echo "Grep No match" || echo "Grep match"

出力

$ ./t1.sh test-file.json
test-file.json
^[\w\d-]+[.]json$
No Match
test-file.json
Grep match
$ ./t1.sh test-file123.json
test-file123.json
^[\w\d-]+[.]json$
No Match
test-file123.json
Grep match
$ ./t1.sh test-file$.json
test-file$.json
^[\w\d-]+[.]json$
No Match
Grep No match

Bashがメタ文字を処理できないのはなぜですか?私はregxを引用すると文字エスケープの問題が解決されると思います。

答え1

コメントからわかるように、人々は正規表現を実装するために互換性のないさまざまな方法を選択しました。 Fine bashマニュアルは、セクション7の正規表現マニュアルを指すセクション3の正規表現マニュアルを指します。読むと、[\w\d-]3文字のうちの1つが一致することがわかりますw d -

[[:alnum:]-]代わりに使用すると、[\w\d-]目的の操作が実行されます。

答え2

他に述べたように、さまざまなツールには正規表現のさまざまな実装/拡張があります。

要件が満たされている場合grep -P(注意して使用されているスイッチは通常存在しないPerl互換のReg Ex機能を有効にするgrep)、それを使用してください。あなたの例では、次のように実装することをお勧めします。

grep -Pq "$regx" <<< "$1" && echo "Grep No match" || echo "Grep match"

関連情報