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'