¿\ D no es compatible con las expresiones básicas de grep?

119

Esto no genera ninguna salida. ¿Cómo?

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

Pero estos lo hacen:

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

$ echo 'this 1 2 3' | grep '\w\+'
this 1 2 3
Ankur Agarwal
fuente
2
Ninguno de esos funciona para mí (Solaris).
Spraff
Yo tampoco. (Cygwin) ¿Querías tener \+? Qué significa eso?
Eric Wilson
sí, estoy en Ubuntu 10.04, usando bash. Para BRE en grep, debe escapar algunos caracteres. Pruebe "Expresiones regulares básicas vs extendidas" en man grep.
Ankur Agarwal
2
@FarmBoy: +en una expresión regular significa "uno o más de los tokens anteriores". En este caso, se escapa porque esa es la sintaxis requerida por grepel motor de expresiones regulares predeterminado.
Daenyth
2
@FarmBoy: +debe escaparse si está usando grep; si está usando egrep, no lo hace. grep -Ees equivalente a egrep(al menos para la versión GNU).
Keith Thompson

Respuestas:

196

grepEl modo predeterminado es (iirc) POSIX regex, y \des pcre. Puede pasar -Pa gnu grep, para expresiones regulares similares a perl, o usar en [[:digit:]]lugar de \d.

daenyth@Bragi ~ $ echo 1 | grep -P '\d'
1
daenyth@Bragi ~ $ echo 1 | grep '[[:digit:]]'
1
Daenyth
fuente
10
El modo -E de BSD grep incluye \ d. Pero el modo -E de GNU grep no lo hace. Eso es tan evidente que me sorprende que lo esté descubriendo ahora.
Keith Tyler
> El modo -E de BSD grep incluye \ d. Pero el modo -E de GNU grep no lo hace. Eso es tan evidente que me sorprende que lo esté descubriendo ahora. Esto solo me mordió en un script de validación de mensajes de confirmación de git. Me sorprendió mucho que fuera el culpable.
Austinbruch
18

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

Charles Ma
fuente
1
tal vez la opción "grep -E" ayude
bortunac