我正在学习如何使用egrep命令,我想找到一行中重复了 3个字符的单词(例如abc-abc-abc
; ssd-ssd-ssd
)。 / p>
我尝试了一些命令,例如
egrep '[a-z][a-z][a-z]{3}' file
grep -e'{([a-z][a-z][a-z]){3}}' file
但不起作用。它只打印所有单词有9个字符
答案 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
...
在任何要将捕获的匹配文本替换为正则表达式的地方,请使用与感兴趣的捕获组相对应的反斜杠数字。