grep with regexp:whitespace不匹配,除非我添加一个断言

时间:2011-08-10 15:11:22

标签: regex linux bash grep

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

2 个答案:

答案 0 :(得分:4)

查看您的grep联机帮助页。 Perl添加了许多不在原始规范中的正则表达式扩展。然而,由于它们证明非常有用,许多程序都采用了它们。

不幸的是,grep有时会被卡住,因为您要确保grep命令与旧版grep保持兼容。

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

答案 1 :(得分:1)

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

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