それで、ある文字が3回繰り返され、他の文字が3回繰り返される6つの文字の単語を見つけようとします。たとえば、aaabbb
またはoookkk
。
努力しています:
grep -E "[a-z]\1{3}\S[a-z]\1{3}" filename
まず、正規表現は正しいですか?第二に、なぜ私はそれを得るのですかgrep: Invalid back reference
?
答え1
いいえ、これは間違った内容です。\1{3}
それが何なのかはわかりませんが、それがまさに問題の原因です。 3つの反復文字とそれに続く3つの反復文字を含む行を見つけるには、次のコマンドを使用します。
grep -E '([a-z])\1{2}([a-z])\2{2}'
これは\1
最初のものを指します。キャプチャされますグループ。角かっこを使用してグループをキャプチャできます。その後、\1
第1グループ、\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}'