
次のようなファイルコンテンツがあります:
A+B
C+D
A+B
これらは文字列です。 の出現を検索したいのですA+B
が、コマンドを と記述しますgrep 'A+B' test.txt
。ただし、 と記述するとgrep 'A\+B' test.txt
結果が返されません。一方、 の代わりに という+
文字列が含まれている場合.
、\
または を追加しないと、検索結果が返されます。 わかりません:
1) いつ追加すべきか\
、いつ追加すべきでないか。
2) 追加したときに結果が得られたのに、+
追加したときに結果が得られなかったのはなぜですか?.
答え1
のどのフレーバーを使用するか指定していませんgrep
が、 を使用する可能性がありますGNU grep
。 デフォルトではgrep
が使用されBasic Regular Expressions
、 で説明されているとおりですman grep
。
基本正規表現と拡張正規表現
基本的な正規表現では、メタ文字 ?、+、{、|、(、 ) は特別な意味を失います。代わりに、バックスラッシュ付きの バージョンの \?、+、{、\|、(、)
を使用します。
を使用した場合は、-E
に切り替えてExtended Regular Expressions (ERE)
を使用する必要があることに注意してください。これは、 および他の多くの正規表現構文\+
では、デフォルトで が を表すためです。ERE
+
one or more of the preceding character
$ grep -E 'A\+B' test.txt
A+B
A+B
それで、あなたの質問に答えると:
\
リテラル文字を検索する場合に使用します。BRE
単一のドットはとany character
同様に を表しますERE
。
答え2
egrep
(または)ではgrep -E
拡張正規表現が有効になっています。これには次のものが含まれます。
+ - match one or more instances of the previous match pattern.
grep
これらは、前にバックスラッシュを付けて基本で使用することができ、通常のリテラル化の意味ではなく、egrep
関数を呼び出します。
したがって、次のものは同等です:-
egrep 'A+B'
grep 'A\+B'
A
どちらの場合も、 の直後に が続く1 つ以上の に一致しますB
。
egrep
では'+' に特別な意味があるため、文字どおりに一致させるにはエスケープする必要があり、次のものも同等になります。
egrep 'A\+B'
grep 'A+B'
A+B
どちらの場合もリテラル「+」が検索されるため、これらは両方とも一致します。
egrep
でエスケープすることで使用できるその他の関数には、代替一致文字列の およびgrep
が含まれます。ここで、M と N は一致パターンの繰り返しの最小値と最大値を表す数値です。これらは ではエスケープされません。\|
\{M,N\}
egrep