grep与正则expression式:空格不匹配,除非我添加一个断言

GNU grep 2.5.4在Ubuntu 10.04的bash 4.1.5(1)上

这匹配

$ 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也显示匹配。 这里有什么区别?

看看你的grep manpage。 Perl添加了许多不在原始规范中的正则表达式扩展。 但是,由于它们非常有用,许多项目都采用了它们。

不幸的是, grep有时会陷入过去,因为你要确保你的grep命令与旧版本的grep保持兼容。

一些系统有一些扩展egrep 。 其他人允许你使用grep -E来获取它们。 还有一些人有一个grep -P ,允许你使用Perl扩展。 我相信Linux系统的grep命令可以使用在大多数Unix系统中不可用的-P扩展,除非有人用grep替换了GNU版本。 较新版本的Mac OS X也支持-P开关,但不支持旧版本。

grep不支持完整的正则表达式集,所以请尝试使用-P来启用perl正则表达式。 你不需要逃避+

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