私が理解したのは、バックスラッシュの後に文字が来るのが正規表現です。
しかし、このコマンドが何をしているのかわかりません。
$ 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