如何使用egrep查找重复的字符簇(例如abc-abc-abc)?

时间:2019-02-14 22:46:49

标签: unix grep

我正在学习如何使用egrep命令,我想找到一行中重复了 3个字符的单词(例如abc-abc-abcssd-ssd-ssd)。 / p>

我尝试了一些命令,例如

egrep '[a-z][a-z][a-z]{3}' file 
grep -e'{([a-z][a-z][a-z]){3}}' file

但不起作用。它只打印所有单词有9个字符

2 个答案:

答案 0 :(得分:3)

您可以使用

grep -e '\(\<[[:alnum:]]\{3\}\>\).*\<\1\>.*\<\1\>'

\<[[:alnum:]]\{3\}\>匹配由3个字母数字字符组成的单词。 \<\>确保周围的字符不是字母数字。

\(...\)将匹配项放入var \ 1中,以便稍后调用

\<\1\>匹配一个单词,该单词的值与记住的匹配项完全相同。

答案 1 :(得分:2)

答案使用捕获组和重复计数的复杂示例):

egrep '([a-z]{3})(-\1){2}'

与以下模式匹配,只允许使用连字符作为分隔符。

abc-abc-abc
ssd-ssd-ssd
zab-zab-zab 
.
.
.

上面的示例有两组paren(捕获组);每个捕获其匹配的文本到其捕获组各自的缓冲区。我们只需要在第二个匹配表达式上加上括号,就可以对它进行重复计数,并对第二组捕获的文本感兴趣。

更简单的示例

这是类似的情况,但更容易理解。它连续匹配3个相同的小写字母:

egrep '([a-z])\1\1'

([a-z])是一个捕获组,它匹配一个小写字母,并将匹配的字符存储在捕获组缓冲区中。注意:每个\1都与捕获的文本(在这种情况下为1个匹配字符)再次匹配。

NOTE:捕获组与序列的 first 字符匹配,因此需要对从第一个匹配项中保存的文本进行两个附加匹配,以便连续匹配三个相同字符。以下示例与上面的示例相同,不同之处在于它使用重复计数(2)将第二项重复两次。

egrep '([a-z])\1{2}'

我以此方式对其进行了测试:


$ echo "aaa" | egrep '([a-z])\1{2}'
aaa
$ echo "zzz" | egrep '([a-z])\1{2}'
zzz
$ echo "zaz" | egrep '([a-z])\1{2}'

注意:第三条回声线没有输出

捕获组的工作方式

转义括号是将组表达式元素一起使用,以作为组重复或对其进行操作,但是 也会使匹配的文本被捕获到内部缓冲区中。

第一个捕获组在正则表达式中从左到右是\1,第二个是\2,第三个\3 ...

在任何要将捕获的匹配文本替换为正则表达式的地方,请使用与感兴趣的捕获组相对应的反斜杠数字。