使用正则表达式的grep:空格不匹配,除非我添加断言

9

在Ubuntu 10.04上,bash版本为4.1.5(1),GNU grep版本为2.5.4。

这个命令可以匹配以下内容:

$ echo "this is a     line" | grep 'a[[:space:]]\+line'
this is a     line

但这并不表示
$ echo "this is a     line" | grep 'a\s\+line'

但这也匹配
$ echo "this is a     line" | grep 'a\s\+\bline'
this is a     line

我不明白为什么#2没有匹配(但#1有匹配),而#3也有匹配。这里有什么区别?

3
在我的GNU grep 2.8中,这个命令可以正常运行:$ echo "this is a line" | grep 'a\s+line' ; echo $? 结果输出为:this is a line 和0。 - Paul Rubel
2和3对我不起作用(GNU grep 2.5.1) - dogbane
所有三个对我都有效:带有GNU grep 2.6.3的Cygwin。 - dreynold
我更想知道为什么 #2 不匹配但 #3 匹配。一个额外的零宽度断言(单词边界)会有如此大的影响吗? - Ankur Agarwal
1
由于grep 2.5中存在错误,请查看此处:Grep white space behavior - user3170995
2个回答

4

grep 不支持完整的正则表达式,因此尝试使用 -P 启用 Perl 正则表达式。您无需转义 +,即可使用它。

echo "this is a     line" | grep -P 'a\s+line' 

我更感兴趣的是为什么#2不匹配而#3匹配。一个额外的零宽断言(单词边界)会产生如此大的差异吗? - Ankur Agarwal

4
请查看您的grep手册。Perl添加了很多正则表达式扩展,这些扩展不在原始规范中。 然而,由于它们被证明非常有用,许多程序都采用了它们。
不幸的是,有时候你要确保你的grep命令与旧版本的grep兼容,所以grep有时会停留在过去。
一些系统有带有一些扩展的egrep。其他允许您使用grep -E来获取它们。还有一些有一个grep -P,可以使用Perl扩展。我相信Linux系统的grep命令可以使用-P扩展,但在大多数Unix系统中不可用,除非有人用GNU版本替换了grep。新版的Mac OS X也支持-P开关,但旧版本不支持。

我更感兴趣的是为什么#2不匹配而#3匹配。一个额外的零宽断言(单词边界)会产生如此大的差异吗? - Ankur Agarwal
实际上,#2和#3的运行对我来说都可以。我在Cygwin上以及在最新版本的Ubuntu Linux上运行Virtual Box在我的PC上完成了这项工作。我还没有在我家的Mac上尝试过。由于它不使用GNU版本的grep,而且除了最基本的正则表达式之外,不识别任何东西,所以两者都无法在我们的Solaris系统上运行。在那个宽阔的空间里是否有除空格以外的任何东西?也许是一个制表符? - David W.
我再试了一下,但是那儿没有制表符。这有点令人困惑和惊讶。 - Ankur Agarwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接