嗨,我一直在使用命令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
是不允许的。
任何帮助都将受到高度赞赏。
答案 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+
$ 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