web-dev-qa-db-ja.com

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

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

やっています:

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

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

9

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

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

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

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

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

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

grep -owE '([a-z])\1{2}([a-z])\2{2}'
12
terdon