gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:26 24 4
gpt4 key购买 nike

您好,我在使用 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

这是不允许的。

如有任何帮助,我们将不胜感激。

最佳答案

试试这个:

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


请注意,如果输入很大,并且您有 PCRE -P 选项,请使用它而不是 -E 作为反向引用会快得多,至少在 的情况下GNU grep

关于linux - egrep 两个相同的数字和两个相同的字母 n 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47655653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com