通常、正規表現でエスケープする必要がある文字は何ですか?
たとえば、次は文法的に正しくありません。
echo '[]' | grep '[]'
grep: Unmatched [ or [^
しかし、はい構文が正しいです。
echo '[]' | grep '\[]'
[]
正規表現でどの文字をエスケープしなければならないのか、どの文字をエスケープしてはならないのかについての文書はありますか?
答え1
正規表現にはさまざまな型があり、特殊文字セットは特定の型によって異なります。そのうちのいくつかを以下に説明します。すべての場合において、特殊文字はバックスラッシュでエスケープされます\
。たとえば、[
あなたが書いたものと一致するように\[
。または、^
文字(除外)を1つずつ角括弧で囲んでエスケープすることもできます[[]
。
一部のコンテキストでは、特殊な文字(たとえば、^
(子)式の先頭にある文字)は、すべてのコンテキストでエスケープできます。
他の人が書いたように:シェルで式を一重引用符で囲まない場合は、エスケープされた正規表現でシェルの特殊文字をさらにエスケープする必要があります。例:bashなどのBourne互換シェルで'\['
作成できます\\[
が"\["
、これは別の話です。"\\["
基本正規表現(BRE)
- POSIX: 基本正規表現
- 注文する:
grep
、sed
- 特殊文字:
.[\
- 特に場合によっては:
*^$
- エスケープ文字列:
"$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"
拡張正規表現(ERE)
- POSIX:拡張正規表現
- コマンド:
grep -E
、sed -E
(以前のGNUバージョンsed -r
:) - 特殊文字:
.[\(
- 特に場合によっては:
*^$+?{|
- エスケープ文字列:
"$(printf '%s' "$string" | sed 's/[.[\(*^$+?{|]/\\&/g')"
答え2
アプリケーションによって異なります。あなたの例では[
パラメータとして引用する必要がありますgrep
が、そうではありませんecho
。
シェルの場合(POSIX仕様):
引用符は、特定の文字または単語の特別な意味をシェルから削除するために使用されます。引用符を使用すると、次の段落で特殊文字の文字通りの意味を保存し、予約語が予約語として認識されるのを防ぎ、ここで文書を処理するときのパラメータの拡張とコマンドの置換を防ぐことができます(ここを参照)。
アプリケーションが自分自身を表すには、次の文字を引用する必要があります。
| & ; < > ( ) $ ` \ " ' <space> <tab> <newline>
場合によっては、次の事項を引用する必要があります。つまり、これらの文字は、IEEE Std 1003.1-2001のこのボリュームで説明されている条件に応じて特別な場合があります。
* ? [ # ˜ = %
さまざまな引用メカニズムには、エスケープ文字、一重引用符、二重引用符が含まれます。ここのドキュメントは代替引用形式を表します。こちらの記事をご覧ください。
特定のプログラム(正規表現、Perl、awkを使用)には、エスケープのための追加要件があります。
答え3
各アプリケーションには独自の「特殊」文字セットがあります。発生した問題はgrep
シェルとは関係ありません。でどの文字を引用すべきかについては、grep
マンページの「正規表現」セクションを読んでください。
シェルの場合、引用符で囲む必要がある文字は次のとおりです。
;'"`#$&*?[]<>{}\
そして空白。
シェルによっては、別の文字を引用符で囲む必要があります。
!^%
「SHELL GRAMMAR」のシェルマニュアルページをご確認ください。
答え4
シェルは、コマンドラインを実行する前にコマンドラインを変換できます。シェルとgrep
引用符を使用して、特定の文字の特別な意味を削除できます。それでも、grep
シェルにはさまざまな特殊文字があります。また、シェルは、コマンドを実行する前に既存の拡張によって発生しなかったエスケープされていない特殊文字を削除します。
echo '[]' | grep '[]'
引数はシェル[]
に渡され、grep
誤った形式の角括弧式で解析されますgrep
。
echo '[]' | grep \[]
上記でも同様のケースを見ることができます。バックスラッシュが削除され、に[]
引数として渡されますgrep
。grep
無効な角かっこ式を識別します。
echo '[]' | grep '\[]'
最後に、この場合、引用符はシェルによって削除され、but\[]
に引数として渡されますgrep
。この特別な場合は、リテラル角括弧として\[
解釈されます。grep
シェルがバックスラッシュを特殊文字として解釈しないようにするには、引用符が必要です。
^POSIX仕様。