comportamiento de los espacios en blanco grep regex


87

Tengo un archivo de texto que contiene algo como:

12,34 EUR 
 5,67 EUR
 ...

Hay un espacio en blanco antes de 'EUR' e ignoro 0, XX EUR.

Lo intenté:

grep '[1-9][0-9]*,[0-9]\{2\}\sEUR' => didn't match !

grep '[1-9][0-9]*,[0-9]\{2\} EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s*EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s[E]UR' => worked !

¿Alguien puede explicarme por favor, por qué no puedo usar \spero \s*y \s[E]emparejar?

SO: Ubuntu 10.04, grep v2.5

Respuestas:


122

Esto parece una diferencia de comportamiento en el manejo de \sgrep 2.5 y versiones más nuevas (¿un error en el grep antiguo?). Confirmo su resultado con grep 2.5.4, pero los cuatro greps funcionan cuando se usa grep 2.6.3 (Ubuntu 10.10).

Nota:

GNU grep 2.5.4
echo "foo bar" | grep "\s"
   (doesn't match)

mientras

GNU grep 2.6.3
echo "foo bar" | grep "\s"
foo bar

Probablemente menos problemas (como \sno está documentado):

Both GNU greps
echo "foo bar" | grep "[[:space:]]"
foo bar

Mi consejo es evitar usar \s... use [ \t]*or [[:space:]]o algo parecido en su lugar.


24
O simplemente [:space:], por ejemplo. así:cat file | grep "[[:space:]]"
Kiril Kirov

parece ser un error en la versión más reciente de grep (otro punto de vista) de acuerdo con esta solicitud de error mail-archive.com/bug-grep@gnu.org/msg02686.html pero ¿por qué coincide la última declaración?
Milde

1
@Milde, tenga en cuenta la publicación de seguimiento mail-archive.com/bug-grep@gnu.org/msg02689.html donde ese informe de error se marcó como no válido y se cerró (por lo que esto no se considera un error en grep más reciente).
Kamal

2
@Milde, ninguna de la documentación grep que he examinado (antigua o nueva) en realidad se refiere \sen absoluto. Yo diría que su comportamiento es "indefinido". Utilice [: space:] en su lugar, que funciona como está documentado en grep antiguo y nuevo.
Kamal

gracias, usaré [: space:] en el futuro para evitar el problema
Milde
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.