- 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*
y
1
X
在输入字符串的末尾,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)