egrep两个相同的数字和两个相同的字母n次

时间:2017-12-05 14:11:08

标签: linux bash unix grep

嗨,我一直在使用命令egrep遇到麻烦。这是我的问题: 让我们说我在这些单词的for循环中运行:

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

我只想打印这个单词,如果它有两个相同的数字两个相同的字母这个单词重复自己。例如,在这种情况下,应该打印的唯一单词是:

99aa88bb99aa88bb
11bb11bb
33aa33bb33aa33bb

因为每个单词至少有一个或多个两个相同的数字和两个相同的字母,然后它自己重复

这是另一个例子,我在循环中讨论这些词:

 aa99aa99 00aa00bb00aa00bb 44aa44aac
 2222aaaa2222aaaa 11cc11cc11cc11cc 

应该打印的唯一单词是

 00aa00bb00aa00bb
 11cc11cc11cc11cc

因为上面提到的什么。 我真的很挣扎如何做到这一点我目前无法正常工作的命令是:

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

之所以不能正常工作是因为它为我打印的字样如下:

11bb11dd

是不允许的。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分: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

这有两种情况

1)(([0-9])\2([a-z])\3([0-9])\4([a-z])\5)\1+有8个字符构造重复至少一次 - 这是关键,使用\1*将错误地匹配11bb11dd

2)(([0-9])\7([a-z])\8)\6这有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+


或者,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 / etc字符,由重复数字后跟重复字母组成
  • 然后在外部组中捕获,然后至少重复一次


请注意,如果输入很大,并且您有PCRE -P选项,则使用该选项代替-E,因为反向引用会更快,至少在GNU grep

的情况下