\ D non è supportato dalle espressioni di base di grep?


119

Questo non genera alcun output. Come mai?

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

Ma questi fanno:

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

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

2
Nessuno di questi funziona per me (Solaris).
spruzzo

Neanche io. (Cygwin) Intendevi avere \+? Cosa significa?
Eric Wilson

sì, sono su Ubuntu 10.04, usando bash. Per BRE in grep devi eseguire l'escape di alcuni caratteri. Prova "Espressioni regolari di base e estese" in man grep.
Ankur Agarwal

2
@FarmBoy: +in una regex significa "uno o più dei token precedenti". In questo caso è sfuggito perché è la sintassi richiesta dal grepmotore regex predefinito di.
Daenyth

2
@FarmBoy: +deve essere evitato se stai usando grep; se stai usando egrep, non lo fa. grep -Eè equivalente a egrep(almeno per la versione GNU).
Keith Thompson

Risposte:


196

grepLa modalità predefinita è (iirc) POSIX regex, ed \dè pcre. Puoi passare -Pa gnu grep, per espressioni regolari simili a Perl, o usare al [[:digit:]]posto di \d.

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

10
La modalità -E di grep BSD include \ d. Ma la modalità -E di GNU grep non lo fa. È così lampante che sono scioccato di scoprirlo solo ora.
Keith Tyler

> La modalità -E di grep BSD include \ d. Ma la modalità -E di GNU grep non lo fa. È così lampante che sono scioccato di scoprirlo solo ora. Questo mi ha appena morso su uno script di convalida del messaggio di commit git. Sono rimasto molto sorpreso che fosse il colpevole.
Austinbruch

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.