2010-11-20 25 views
53

Tengo un archivo de texto, que contiene algo como:comportamiento de los espacios en blanco de expresiones regulares grep

12,34 EUR 
5,67 EUR 
... 

Hay un espacio en blanco antes 'EUR' y yo ignore 0, XX de euros.

me trataron:

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 !

Puede alguien explicar pls, ¿por qué no puedo usar \s pero \s* y \s[E] emparejado?

OS: Ubuntu 10.04, grep v2.5

Respuesta

78

Esto parece ser una diferencia de comportamiento en el manejo de \s entre las versiones 2.5 y posteriores grep (un error en edad grep?). Confirmo tu resultado con grep 2.5.4, pero las cuatro greps funcionan cuando utilizas grep 2.6.3 (Ubuntu 10.10).

Nota:

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

mientras que

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

Probablemente menos problemas (como \s no está documentado):

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

Mi consejo es evitar el uso \s ... uso [ \t]* o [:space:] o algo así g me gusta en su lugar.

+19

O simplemente '[: space:]', por ej. de esta manera: 'cat file | grep "[[: space:]]" ' –

+0

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

+0

@Milde, fíjese en la publicación de seguimiento http://www.mail-archive.com/[email protected]/msg02689.html donde el informe de error se marcó como no válido y se cerró (por lo tanto, esto no se considera un error en grep más nuevo). – Kamal

Cuestiones relacionadas