2017-12-05 14 views
1

こんにちは私はegrepコマンドで問題を抱えてきました。ここに私の質問は:egrep 2つの同一の数字と2つの同一の文字n回

99aa88bb99aa88bb 9a9a 11bb11bb 11bb11dd 12aa12aa 
33aa33bb33aa33bb 

私はそれが二つの同一番号二つの同一の文字持っている場合の単語を印刷したい: は、私はこれらの言葉では、ループのために走っていただけと言うことができます単語はそれ自身を繰り返す。例えばこの場合、印刷すべき唯一の言葉は、次のとおり

99aa88bb99aa88bb 
11bb11bb 
33aa33bb33aa33bb 

各ワードは、2つの同一の数字及び2つの同一文字のうち少なくとも一つ以上のセットを持っており、それはここでそれ自体

を繰り返すため別の例として、私は、ループ内でこれらの単語の上につもりです:

aa99aa99 00aa00bb00aa00bb 44aa44aac 
2222aaaa2222aaaa 11cc11cc11cc11cc 

印刷する必要がありますだけの言葉は

00aa00bb00aa00bb 
11cc11cc11cc11cc 
です

上記の理由により 私は本当にありえない作業があることを、この私の現在のコマンド実行方法に苦労しています:

egrep "^((([0-9])\3([a-z])\4)(([0-9])\6([a-z])\7))\1*$" tmp 

そのが働いていない理由、それは私のためのような言葉出力しますので:許可されていません

11bb11dd 

を。

ご協力いただければ幸いです。

+0

の場合には、はるかに高速になること
注意は、彼らが常に偶数長の言葉になります呼び出すことそれは公正ですか?またはそれらは変わることができますか? – Inian

+0

@Inianはい –

答えて

2

これを試してみてください:

$ cat ip.txt 
99aa88bb99aa88bb 9a9a 11bb11bb 11bb11dd 12aa12aa 
33aa33bb33aa33bb 
aa99aa99 00aa00bb00aa00bb 44aa44aac 
2222aaaa2222aaaa 11cc11cc11cc11cc 

$ grep -owE '(([0-9])\2([a-z])\3([0-9])\4([a-z])\5)\1+|(([0-9])\7([a-z])\8)\6' ip.txt 
99aa88bb99aa88bb 
11bb11bb 
33aa33bb33aa33bb 
00aa00bb00aa00bb 
11cc11cc11cc11cc 

これは2例

少なくとも一回繰り返し8文字の構造を持っている

1)(([0-9])\2([a-z])\3([0-9])\4([a-z])\5)\1+を持っている - それは\1*が誤って11bb11dd

と一致します使用して、キーであります2)(([0-9])\7([a-z])\8)\6これは正確に1回繰り返す4文字の構成を持っています


あなたは別々の行にそれらを持っている場合、これは

grep -xE '(([0-9])\2([a-z])\3([0-9])\4([a-z])\5)\1+|(([0-9])\7([a-z])\8)\6' 


を行うだろう11bb11bb11bbが同様に一致する必要がある場合は、\6+


それとも、この非常に巧妙な提案を使用を使用by Nahuel Fouilleul

$ grep -owE '((([0-9])\3([a-z])\4)+)\1+' ip.txt 
99aa88bb99aa88bb 
11bb11bb 
33aa33bb33aa33bb 
00aa00bb00aa00bb 
11cc11cc11cc11cc 
数字は、次いで、外側グループに捕捉し、その後少なくとも一度

繰り返されるアルファベット

  • を繰り返し、続いて繰り返しから成るの
    • (([0-9])\3([a-z])\4)+形ベース4/8月12日/ 16 /などの文字入力が大きく、あなたはPCRE -Pオプションを持っている場合は、後方参照として代わりに-Eの使用は、少なくともGNU grep

  • +1

    「grep -oE」\ b((([0-9])\ 3([a-z])\ 4)+)\ 1 \ b''はなぜですか?またはgrep -oEw((([0-9])\ 3([az])\ 4)+)\ 1 " –

    +0

    @NahuelFouilleulこれは本当に賢いです。しかし、11bb11bb11bbとは一致しません。もしOPがほしいと思うかどうかわからないのは確かに単語境界のため – Sundeep

    +0

    ですが、 '\ 1 'の後に' + 'を追加することで修正することができます –

    関連する問題