grep検索文字列で\を使用する場合

grep検索文字列で\を使用する場合

次のようなファイルコンテンツがあります:

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

それで、あなたの質問に答えると:

  1. \リテラル文字を検索する場合に使用します。

  2. 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

関連情報