这是一个grep bug吗?

时间:2013-09-12 19:06:23

标签: regex grep

我希望

egrep -i "((\w)\2){4,}" /usr/share/dict/words

匹配“subbookkeeper”这个词,但它没有。

思想?

4 个答案:

答案 0 :(得分:3)

显然egrep不支持{m,n}重复语法:

$ egrep -i '((\w)\2)((\w)\4)((\w)\6)' words 
bookkeeper
bookkeeping
subbookkeeper
$ egrep -i '((\w)\2)((\w)\4)((\w)\6)((\w)\8)' words 
subbookkeeper

如果你拼出这些组,它就可以了。

这是在我的Mac上。

答案 1 :(得分:2)

问题似乎是egrep没有在重复上重置捕获的组。不确定这是一个错误还是只是含糊不清的符号意味着什么。如果你手动重复,那么它应该工作:

egrep -i "(\w)\1(\w)\2(\w)\3(\w)\4" /usr/share/dict/words

然而,奇怪的是,这不起作用。这在perl中起作用:

perl -lne "print if /((\w)\2){3}/" /usr/share/dict/words
BTW,egrep确实支持{m,n}语法。这证明了:

egrep -i "a{2}" /usr/share/dict/words

答案 2 :(得分:0)

你的正则表达式是正确的,没有错误。 /usr/share/dict/words不包含“subbookkeeper”一词。

答案 3 :(得分:0)

在我的freebsd系统上,它确实找到了匹配

[vaibhavc@freebsd-vai ~]$ cat acb
subbookkeeper

[vaibhavc@freebsd-vai ~]$ egrep "((\w)\2){4,}" -i acb
subbookkeeper