Grep Regex Whitespace Verhalten

85

Ich habe eine Textdatei, die Folgendes enthält:

12,34 EUR 
 5,67 EUR
 ...

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

Ich habe es 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 verwenden können , \saber \s*und \s[E]abgestimmt?

Betriebssystem: Ubuntu 10.04, grep v2.5

Milde
quelle

Antworten:

119

Dies scheint ein Verhaltensunterschied bei der Behandlung von \sgrep 2.5 und neueren Versionen zu sein (ein Fehler in altem grep?). Ich bestätige Ihr Ergebnis mit grep 2.5.4, aber alle vier greps funktionieren, wenn Sie grep 2.6.3 (Ubuntu 10.10) verwenden.

Hinweis:

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

wohingegen

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

Wahrscheinlich weniger Ärger (wie \snicht dokumentiert):

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

Mein Rat ist, stattdessen \s... use [ \t]*oder [[:space:]]ähnliches zu vermeiden .

Kamal
quelle
22
Oder einfach [:space:]zum Beispiel. so:cat file | grep "[[:space:]]"
Kiril Kirov
Laut dieser Fehleranforderung mail-archive.com/[email protected]/msg02686.html scheint es sich um einen Fehler in der neueren Version von grep zu handeln (andere Sichtweise). Aber warum stimmt die letzte Anweisung überein?
Milde
1
@Milde, beachten Sie den Follow-up-Beitrag mail-archive.com/[email protected]/msg02689.html, in dem dieser Fehlerbericht als ungültig und geschlossen markiert wurde (dies wird also in neueren grep nicht als Fehler angesehen).
Kamal
2
@Milde, keine der von mir untersuchten Grep-Dokumentationen (alt oder neu) bezieht sich \süberhaupt auf sie. Ich würde sagen, sein Verhalten ist "undefiniert". Verwenden Sie stattdessen [: space:], was wie in altem und neuem grep dokumentiert funktioniert.
Kamal
danke, ich werde [: space:] in Zukunft verwenden, um das Problem zu vermeiden
Milde