web-dev-qa-db-ja.com

grep正規表現での特殊文字のエスケープ

ファイルに対してgrep正規表現を実行しようとしていますが、「00」と「0」が表示されている行を除外する必要があります。私はこの表現を思いついた:

grep -a -E \"stored\"\:\ \"\*123\*(?!00)[0-9]{2,5}\#\" $filename

しかし、bashで実行しようとすると、

-bash !00: event not found、または(私が入力した後はset +H)、

-bash: syntax error near unexpected token( '`

この正規表現をbashで適切にエスケープするには、何をする必要がありますか?

1
SinaOwolabi

シェルで特別な意味を持つ!をエスケープしなかったため、エラーメッセージが表示されます。 grepのパターンパラメータの一部として使用するには、引用符で囲むか、エスケープする必要があります。

すべての特殊文字を1つずつ引用する代わりに、パターン全体を(目的に応じて)一重引用符または二重引用符で囲む方がはるかに簡単です。次に例を示します。

grep -a -P '"stored": "*123*(?!00)[0-9]{2,5}#"'

また、負の先読み-Egrep拡張正規表現の一般的な実装では機能しないため、-P(?!...)に置き換えたことにも注意してください。 -Pフラグは、これをサポートするPerl正規表現を有効にします。

2
janos