Wird \ d von den Grundausdrücken von grep nicht unterstützt?

118

Dies erzeugt keine Ausgabe. Woher?

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

Aber diese tun:

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

$ echo 'this 1 2 3' | grep '\w\+'
this 1 2 3
Ankur Agarwal
quelle
2
Nichts davon funktioniert für mich (Solaris).
Spraff
Ich auch nicht. (Cygwin) Wolltest du haben \+? Was bedeutet das?
Eric Wilson
Ja, ich bin auf Ubuntu 10.04 und benutze Bash. Für BRE in grep müssen Sie einigen Zeichen entkommen. Versuchen Sie "Basic vs Extended Regular Expressions" in man grep.
Ankur Agarwal
2
@FarmBoy: +In einem regulären Ausdruck bedeutet "einer oder mehrere der vorherigen Token". In diesem Fall wird es maskiert, da dies die Syntax ist, die von grepder Standard-Regex-Engine benötigt wird.
Daenyth
2
@FarmBoy: +muss maskiert werden, wenn Sie verwenden grep; Wenn Sie verwenden egrep, ist dies nicht der Fall. grep -Eentspricht egrep(zumindest für die GNU-Version).
Keith Thompson

Antworten:

196

grepDer Standardmodus ist (iirc) POSIX \dregex und ist pcre. Sie können entweder -Pan gnu grep übergeben, um perlähnliche reguläre Ausdrücke zu erhalten, oder [[:digit:]]stattdessen verwenden \d.

daenyth@Bragi ~ $ echo 1 | grep -P '\d'
1
daenyth@Bragi ~ $ echo 1 | grep '[[:digit:]]'
1
Daenyth
quelle
10
Der -E-Modus von BSD grep enthält \ d. Der -E-Modus von GNU grep funktioniert jedoch nicht. Das ist so grell, dass ich schockiert bin, dass ich es gerade erst entdecke.
Keith Tyler
> Der -E-Modus von BSD grep enthält \ d. Der -E-Modus von GNU grep funktioniert jedoch nicht. Das ist so grell, dass ich schockiert bin, dass ich es gerade erst entdecke. Dies hat mich nur in ein Validierungsskript für Git-Commit-Nachrichten gebissen. Ich war sehr überrascht, dass der Schuldige war.
Austinbruch
18

Versuche dies $ echo 'this 1 2 3' | grep '[0-9]\+'

Charles Ma
quelle
1
Vielleicht hilft die Option "grep -E"
Bortunac