我试图找到具有连续重复字母出现两次或三次的单词。但是我无法找到一种使用ERE量词和捕获组的方法。
$ grep --version | head -n1
grep (GNU grep) 2.25
$ # consecutive repeated letters occurring twice
$ grep -m5 -xiE '[a-z]*([a-z])\1[a-z]*[a-z]*([a-z])\2[a-z]*' /usr/share/dict/words
Abbott
Annabelle
Annette
Appaloosa
Appleseed
$ # no output for this, why?
$ grep -m5 -xiE '([a-z]*([a-z])\2[a-z]*){2}' /usr/share/dict/words
虽然这个问题可以使用-P
解决
$ grep -m5 -xiP '([a-z]*([a-z])\2[a-z]*){2}' /usr/share/dict/words
Abbott
Annabelle
Annette
Appaloosa
Appleseed
$ grep -m5 -xiP '([a-z]*([a-z])\2[a-z]*){3}' /usr/share/dict/words
Chattahoochee
McConnell
Mississippi
Mississippian
Mississippians
感谢Casimir et Hippolyte提供更简单的输入和正则表达式来测试这个行为。
$ echo 'aazbb' | grep -E '(([a-z])\2[a-z]*){2}' || echo 'No match'
aazbb
$ echo 'aazbbycc' | grep -E '(([a-z])\2[a-z]*){2}([a-z])\3[a-z]*' || echo 'No match'
aazbbycc
$ echo 'aazbbycc' | grep -P '(([a-z])\2[a-z]*){3}' || echo 'No match'
aazbbycc
$ # failing case
$ echo 'aazbbycc' | grep -E '(([a-z])\2[a-z]*){3}' || echo 'No match'
No match
使用 sed
同样看到了相同的行为
$ sed --version | head -n1
sed (GNU sed) 4.2.2
$ echo 'aazbb' | sed -E '/(([a-z])\2[a-z]*){2}/! s/.*/No match/'
aazbb
$ echo 'aazbbycc' | sed -E '/(([a-z])\2[a-z]*){2}([a-z])\3[a-z]*/! s/.*/No match/'
aazbbycc
$ # failing case
$ echo 'aazbbycc' | sed -E '/(([a-z])\2[a-z]*){3}/! s/.*/No match/'
No match
相关搜索链接,我查看了其中一些,但没有找到与此问题相似的内容
如果这个问题在更新版本的 grep
或者 sed
中已经解决,请让我知道。同时,如果这个问题出现在非GNU实现中,请告诉我。
echo 'aazbb' | grep -m5 -xiE '(([a-z])\2[a-z]*){2}
可以正常工作,但命令echo 'aazbbycc' | grep -m5 -xiE '(([a-z])\2[a-z]*){3}
则不能。我怀疑 grep 会在模式复杂度太高时悄悄地终止匹配。 - Casimir et Hippolyte