grepの正規表現、バックスラッシュ、括弧

grepの正規表現、バックスラッシュ、括弧

私が理解したのは、バックスラッシュの後に文字が来るのが正規表現です。

しかし、このコマンドが何をしているのかわかりません。

$ grep '\(.\)\1' < exemple
22
88 9999 88
$ cat exemple
1 1 1 1 1
abc bc fghi
123 45 678
ABC BC FGHI
88 9999 88

ドットはすべての文字と一致する必要があり、角括弧はパターンと一致しなければならず(これは不明)、\ 1が何をしているのか理解できません。

答え1

正規表現は、\(.\)\1特定の文字の後に同じ文字が続くすべての行と一致します。ランダムな単一文字、.点の周囲の部分文字列\(と一致し、一致を「キャプチャ」し、一致した文字である最初のキャプチャグループへの逆参照です。\)\1

入力例には、次の式に一致する行があります。

88 9999 88

ここで、式は最初の部分88文字列と一致するため、grep行を標準出力ストリームに出力します。

「バックスラッシュの後ろに文字が来るのは正規表現です」という声明は少し誤解を招くかもしれません。完全な式は正規表現(この場合は「拡張」正規表現ではなく「基本」正規表現)であり、バックスラッシュは特定の文字の意味を変更します。たとえば、\[バックスラッシュは次のようになります。削除済み特別な意味を持ち[(グループ内の単一文字に一致する角括弧式を導入します)、リテラルの左角括弧を強制的に一致させます。

文字列にはバックスラッシュが含まれているため、正規表現ではありません。正規表現として解釈するユーティリティと一緒に使用するので正規表現です。このような文字列もhello正規表現として使用できます(したがって、部分hello文字列を含むすべての文字列と一致します)。

答え2

\ 1は、キャプチャグループ(括弧で囲まれた部分)の逆参照であるようです。これは、一致の特定の部分だけを出力したい状況で役立ちます。私はこれをしばらく前に使用しました:https://stackoverflow.com/questions/65641590/sed-expression-just-prints-entire-file

関連情報