在否定字符类中使用\ s时混淆grep行为

时间:2013-02-17 05:28:54

标签: regex grep

如果前面跟着"以外的非空格字符和任意数量的空格字符,我有一个匹配“x”的正则表达式:

[^"\s]\s*x

这在JavaScript中可以正常工作:

$ node
> /[^"\s]\s*x/.test('x')
false
> /[^"\s]\s*x/.test(' x')
false
> /[^"\s]\s*x/.test('" x')
false
> /[^"\s]\s*x/.test(': x')
true
但是,grep的行为有所不同:

$ echo 'x' | grep '[^"\s]\s*x'

$ echo ' x' | grep '[^"\s]\s*x'
 x

$ echo '" x' | grep '[^"\s]\s*x'
" x

$ echo ': x' | grep '[^"\s]\s*x'
: x

这种行为有解释吗?我如何重写grep的正则表达式,使其表现如预期?

2 个答案:

答案 0 :(得分:4)

根据this page []内的反斜杠字面意思。因此,您的否定组不是“不是引号或空格字符”,而是“不是引号,反斜杠或s”。

请尝试[^"[:space:]]

答案 1 :(得分:3)

您可以指示grep与-P选项兼容:

$ echo 'x' | grep -P '[^"\s]\s*x'

$ echo ' x' | grep -P '[^"\s]\s*x'

$ echo '" x' | grep -P '[^"\s]\s*x'

$ echo ': x' | grep -P '[^"\s]\s*x'
: x

编辑:删除-P开关

后,Mac上无法使用