grepを使用した無効な後方参照


9

つまり、1つの文字が3回繰り返され、その後に別の文字が3回繰り返される6文字の単語を見つけようとしています。たとえばaaabbbまたはoookkk

やっています:

grep -E "[a-z]\1{3}\S[a-z]\1{3}" filename

まず、正規表現は正しいですか?第二に、なぜ私は得るのgrep: Invalid back referenceですか?


1
正確に一致する必要があるものを説明してください。あなたの正規表現は正しくないので、あなたが何を求めているのか理解できません。ある文字を3回繰り返し、次に別の文字を3回繰り返す単語を探していますか?それともあなたもマッチしたいaaabbbfoobarですか?どうaaaabbbですか?理想的には、いくつかの入力例と希望する出力を示してください。
terdon

1
後方参照は何かを参照する必要があり、その何かが指定されていません。通常は、括弧を使用して式をグループ化します。たとえば、grep -E '([a-z]{2})([0-9]{2})\2\1'と一致しaa9999aaます。
muru

@terdonある文字を3回繰り返し、次に別の文字を3回繰り返す単語を探していますか?はい。それともaaabbbfoobarにも一致させたいですか?以下のような番号だけの単語oookkkを含まない言葉(もはやよりも6文字)oookkkのようなoookkkfoobar
ハイライト工場

@HighlightsFactory OK、その場合grep -w、私の回答で示した例を使用します。
terdon

もう1つ、あなたも一致させたいaaaaaaですか、それとも少なくとも2つの異なる文字が必要ですか?入力例と望ましい出力例を挙げてください。
terdon

回答:


12

いいえ、正しくありません。何\1{3}が想定されているのかはわかりませんが、それが問題の原因です。3つの繰り返された文字とその後に続く3つの繰り返された文字を含む行を検索する場合は、次のように使用できます。

grep -E '([a-z])\1{2}([a-z])\2{2}'

\1最初指す捕捉基。括弧を使用してグループをキャプチャできます。次に、\11 \2番目のグループで、2番目のグループとなります。キャプチャされたグループgrepがなかったため、参照するものがないため無効な参照について不満を言っていました。したがって、上記の正規表現では、括弧が2つのグループをキャプチャしています。次に、最初の一致もカウントされるため、必要では{2}ありません{3}

単語である必要があるかどうか、または単語内で一致する必要があるかどうかは指定しません。単語全体を一致させたい(そしてのようなものを除外したい)場合aaaabbbは、代わりにこれを使用してください:

grep -wE '([a-z])\1{2}([a-z])\2{2}'

行全体ではなく、行の一致した部分(単語)のみを印刷するには、(GNU grepのみ)を使用します。

grep -owE '([a-z])\1{2}([a-z])\2{2}'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.