2010-11-20 5 views
53

Ich habe eine Textdatei, mit so etwas wie:grep regex Leerzeichen Verhalten

12,34 EUR 
5,67 EUR 
... 

Es gibt ein Leerzeichen vor 'EUR' und ich ignoriere 0, XX EUR.

Ich habe versucht:

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 !

Kann mir jemand pls erklären, warum ich nicht \s verwenden können, aber \s* und \s[E] abgestimmt?

OS: Ubuntu 10.04, grep v2.5

Antwort

78

Das sieht wie ein Verhalten Unterschied im Umgang mit \s zwischen grep 2.5 und neueren Versionen (einem Fehler in alten grep?). Ich bestätige dein Ergebnis mit grep 2.5.4, aber alle vier deiner Greps funktionieren mit grep 2.6.3 (Ubuntu 10.10).

Hinweis:

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

während

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

Wahrscheinlich weniger Probleme (wie \s nicht dokumentiert ist):

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

ist mein Rat mit \s zu vermeiden ... Verwendung [ \t]* oder [:space:] oder etwas Ich mag es stattdessen.

+19

Oder einfach nur '[: space:]', z. so: 'Katzendatei | grep "[[: space:]:]]" ' –

+0

Es scheint sich um einen Bug in der neueren Version von grep zu handeln (andere Sichtweise) gemäß dieser Fehleranforderung http://www.mail-archive.com/bug-grep @ gnu.org/msg02686.html aber warum stimmt die letzte Aussage überein? – Milde

+0

@Milde, beachten Sie den folgenden Post http://www.mail-archive.com/[email protected]/msg02689.html, in dem dieser Fehlerbericht als ungültig und geschlossen markiert wurde (dies wird also nicht als Fehler angesehen) in neueren Grep). – Kamal