与 grep/egrep 匹配的奇怪正则表达式

与 grep/egrep 匹配的奇怪正则表达式
  • GNU bash,版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
  • grep(GNU grep)2.20
  • grep-2.20-3.el7.x86_64

有人能解释一下这个谜题吗?我与 grep/egrep 的匹配错误。

echo "somestringthing" | egrep  '\bstring*'
(no output as expected)
echo "somestringthing" | egrep '\bsomestring*'
somestringthing
echo "somestringthing" | egrep '\bsomestringthingy*'
somestringthing
echo "somestringthing" | egrep '\bsomestringthing1*'
somestringthing
echo "somestringthing" | egrep '\bsomestringthingX*'
somestringthing

由于通配符之前有一个字符,最后三个不应该匹配。经过实验,我发现任何字符串都会匹配,就好像通配符之前的单个字符不存在一样。

'\b' 是一个字边界,仅供参考。

那么我在这里遗漏了一些东西,还是这是 grep 中的一个错误? (谈论尝试调试您认为正常工作的代码的令人抓狂的疯狂。)

答案1

最后三个正则表达式末尾的 , 和 将分别匹配零个y*1*多个,和。X*y1X

在输入字符串的末尾,somestringthing您实际上有零个或多个这些字符(确切地零),因此所有三个表达式都匹配。

如果你想搭配或 morey在字符串末尾,在扩展正则表达式中使用y+or ,或者在基本正则表达式中使用 or (不带):y{1,}yy*y\{1,\}grep-E

echo somestringthing | grep -E 'somestringthingy+'

(这不会产生任何输出)

另请注意,它egrep已被弃用,您应该使用grep -E.如果您只想匹配完整的单词,请使用grep -E -w(这需要在输入中匹配的开头和结尾处有单词边界)。

答案2

呸..更乱了,似乎 * 通配符之前的字符被视为

grep 的正确通配符使用显然是.*不只是*

另外,一旦我使用了 \b 就不再需要了.*作为通配符。 -w 标志按预期工作:

echo "somestringthing" | egrep -w 'somestring.*'
somestringthing

echo "somestringthing" | egrep -w 'somestringy.*'
(no output as expected)

相关内容