\ D n'est-il pas pris en charge par les expressions de base de grep?

119

Cela ne génère aucune sortie. Comment venir?

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

Mais ceux-ci font:

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

$ echo 'this 1 2 3' | grep '\w\+'
this 1 2 3
Ankur Agarwal
la source
2
Aucun de ceux-ci ne fonctionne pour moi (Solaris).
spraff
Moi non plus. (Cygwin) Vouliez-vous avoir \+? Qu'est-ce que ça veut dire?
Eric Wilson
oui, je suis sur Ubuntu 10.04, en utilisant bash. Pour BRE en grep, vous devez échapper certains caractères. Essayez "Basic vs Extended Regular Expressions" dans man grep.
Ankur Agarwal
2
@FarmBoy: +dans un regex signifie "un ou plusieurs des jetons précédents". Dans ce cas, il est échappé car c'est la syntaxe requise par greple moteur d'expression régulière par défaut de.
Daenyth
2
@FarmBoy: +doit être échappé si vous utilisez grep; si vous utilisez egrep, ce n'est pas le cas. grep -Eéquivaut à egrep(au moins pour la version GNU).
Keith Thompson

Réponses:

196

grepLe mode par défaut de (iirc) POSIX regex et \dpcre. Vous pouvez passer -Pà gnu grep, pour les expressions rationnelles de type Perl, ou utiliser à la [[:digit:]]place de \d.

daenyth@Bragi ~ $ echo 1 | grep -P '\d'
1
daenyth@Bragi ~ $ echo 1 | grep '[[:digit:]]'
1
Daenyth
la source
10
Le mode -E de BSD grep inclut \ d. Mais pas le mode -E de GNU grep. C'est tellement flagrant que je suis choqué de le découvrir maintenant.
Keith Tyler
> Le mode -E de BSD grep inclut \ d. Mais pas le mode -E de GNU grep. C'est tellement flagrant que je suis choqué de le découvrir maintenant. Cela m'a juste mordu sur un script de validation de message git commit. J'ai été très surpris que \ d soit le coupable.
austinbruch
18

Essaye ça $ echo 'this 1 2 3' | grep '[0-9]\+'

Charles Ma
la source
1
peut-être que l'option "grep -E" aidera
bortunac