\ 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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.