grep的基本表达式不支持\ d吗?


118

这不会产生任何输出。怎么会?

$ echo 'this 1 2 3' | grep '\d\+'

但是这些可以做到:

$ echo 'this 1 2 3' | grep '\s\+'
this 1 2 3

$ echo 'this 1 2 3' | grep '\w\+'
this 1 2 3

2
这些都不适合我(Solaris)。
spraff 2011年

我也不。(西格温)你是说要吃\+?那是什么意思?
埃里克·威尔逊

是的,我使用bash在Ubuntu 10.04上。对于grep中的BRE,您必须转义一些字符。在man grep中尝试“基本vs扩展正则表达式”。
Ankur Agarwal

2
@FarmBoy:+在正则表达式中表示“一个或多个先前令牌”。在这种情况下,它已被逸出,因为这grep是默认regex引擎所需的语法。
2011年

2
@FarmBoy:+如果您正在使用grep,则需要转义;如果您使用egrep,则不会。 grep -E等价于egrep(至少对于GNU版本)。
基思·汤普森

Answers:


196

grep的默认模式是(iirc)POSIX正则表达式,并且\d是pcre。您可以传递-P给gnu grep,以获得类似perl的正则表达式,也可以使用[[:digit:]]代替\d

daenyth@Bragi ~ $ echo 1 | grep -P '\d'
1
daenyth@Bragi ~ $ echo 1 | grep '[[:digit:]]'
1

10
BSD grep的-E模式包括\ d。但是GNU grep的-E模式没有。那真是太刺眼了,我震惊了,我现在才发现它。
基思·泰勒

> BSD grep的-E模式包括\ d。但是GNU grep的-E模式没有。那真是太刺眼了,我震惊了,我现在才发现它。这只是给我一个git commit消息验证脚本的麻烦。我很惊讶\ d是罪魁祸首。
奥斯汀布鲁

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.