如果前面跟着"
以外的非空格字符和任意数量的空格字符,我有一个匹配“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的正则表达式,使其表现如预期?
答案 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上无法使用