¿\ 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

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.