2010-11-20 18 views
53

Mam plik tekstowy zawierający coś takiego:grep regex spacje zachowanie

12,34 EUR 
5,67 EUR 
... 

Jest jedna spacja przed 'EUR' i ignorować 0, xx EUR.

Próbowałem:

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 !

Czy ktoś mógłby wyjaśnić mi pls, dlaczego nie mogę używać \s ale \s* i \s[E] dopasowane?

OS: Ubuntu 10.04, grep v2.5

Odpowiedz

78

To wygląda różnicy zachowanie w obsłudze \s między grep 2.5 i nowszych wersji (błąd w starym grep?). Potwierdzam Twój wynik grepem 2.5.4, ale wszystkie cztery twoje grepy działają przy użyciu grep 2.6.3 (Ubuntu 10.10).

Uwaga:

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

natomiast

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

Prawdopodobnie mniej kłopotów (jak \s nie jest udokumentowane):

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

Moja rada jest, aby unikać \s ... stosowanie [ \t]* lub [:space:] lub coś zamiast tego lubię.

+19

Lub po prostu '[: space:]', np. w ten sposób: 'plik cat | grep "[[: space:]]" ' –

+0

wydaje się być błędem w nowszej wersji grep (inny punkt widzenia) zgodnie z tym zgłoszeniem błędu http://www.mail-archive.com/bug-grep @ gnu.org/msg02686.html, ale dlaczego ostatnie zdanie pasuje? – Milde

+0

@Milde, zanotuj następującą wiadomość http://www.mail-archive.com/[email protected]/msg02689.html gdzie ten raport o błędzie został oznaczony jako niepoprawny i zamknięty (więc nie jest to uważane za błąd w nowszym grep). – Kamal