2010-11-20 16 views
53

Ho un file di testo, che contiene qualcosa come:grep comportamento spazi regex

12,34 EUR 
5,67 EUR 
... 

C'è uno spazio bianco prima di 'euro' e mi ignorano 0, XX EUR.

ho provato:

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 !

Qualcuno può spiegare pls, perché non posso usare \s ma \s* e \s[E] abbinato?

OS: Ubuntu 10.04, grep v2.5

risposta

78

Questo appare come una differenza comportamento nella gestione dei \s tra le versioni 2.5 e grep più recenti (un bug nel vecchio grep?). Confermo il risultato con grep 2.5.4, ma tutti e quattro i greps funzionano quando si utilizza grep 2.6.3 (Ubuntu 10.10).

Nota:

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

mentre

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

Probabilmente meno problemi (come \s non è documentato):

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

Il mio consiglio è quello di evitare l'uso di \s ... uso [ \t]* o [:space:] o qualcosa del genere Mi piace invece.

+19

Oppure solo '[: spazio:]', per es. così: 'cat file | grep "[[: space:]]" ' –

+0

sembra un bug nella nuova versione di grep (altro punto di vista) in base a questa richiesta di bug http://www.mail-archive.com/bug-grep @ gnu.org/msg02686.html ma perché l'ultima istruzione corrisponde? – Milde

+0

@Milde, prendi nota del post successivo http://www.mail-archive.com/[email protected]/msg02689.html dove tale segnalazione è stata contrassegnata come non valida e chiusa (quindi questo non è considerato un bug in più nuovo grep). – Kamal

Problemi correlati