grepを使用した誤った逆参照

grepを使用した誤った逆参照

それで、ある文字が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}'

関連情報