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

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 .


22
Oder einfach [:space:]zum Beispiel. so:cat file | grep "[[:space:]]"
Kiril Kirov

Laut dieser Fehleranforderung mail-archive.com/bug-grep@gnu.org/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/bug-grep@gnu.org/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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.