comportamento degli spazi bianchi delle espressioni regolari grep


90

Ho un file di testo, contenente qualcosa come:

12,34 EUR 
 5,67 EUR
 ...

C'è uno spazio bianco prima di "EUR" e ignoro 0, XX EUR.

Provai:

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ò spiegarmi per favore, perché non posso usare \sma \s*e \s[E]abbinato?

Sistema operativo: Ubuntu 10.04, grep v2.5

Risposte:


124

Questa sembra una differenza di comportamento nella gestione di \sgrep 2.5 e versioni più recenti (un bug nel vecchio grep?). Confermo il tuo risultato con grep 2.5.4, ma tutti e quattro i tuoi grep funzionano quando usi 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 \snon è documentato):

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

Il mio consiglio è di evitare di usare \s... usare [ \t]*o [[:space:]]o qualcosa di simile invece.


24
O semplicemente [:space:], per es. in questo modo:cat file | grep "[[:space:]]"
Kiril Kirov

sembra essere un bug nella versione più recente di grep (altro punto di vista) secondo questa richiesta di bug mail-archive.com/bug-grep@gnu.org/msg02686.html ma perché l'ultima istruzione corrisponde?
Milde

1
@Milde, nota il post di follow-up mail-archive.com/bug-grep@gnu.org/msg02689.html dove quel bug report è stato contrassegnato come non valido e chiuso (quindi questo non è considerato un bug nel più recente grep).
Kamal

2
@Milde, nessuna della documentazione grep che ho esaminato (vecchia o nuova) si riferisce effettivamente \sa tutti. Direi che il suo comportamento è "indefinito". Usa [: space:] invece, che funziona come documentato nel vecchio e nel nuovo grep.
Kamal

grazie, userò [: space:] in futuro per evitare il problema
Milde
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.