grep regex zachowanie białych znaków

90

Mam plik tekstowy zawierający coś takiego:

12,34 EUR 
 5,67 EUR
 ...

Przed „EUR” jest jedna spacja i ignoruję 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ś może mi wyjaśnić, dlaczego nie mogę użyć, \sale \s*i \s[E]dopasowane?

System operacyjny: Ubuntu 10.04, grep v2.5

Milde
źródło

Odpowiedzi:

124

Wygląda to na różnicę w zachowaniu w obsłudze \sgrepa 2.5 i nowszych wersji (błąd w starym grepie?). Potwierdzam twój wynik za pomocą grep 2.5.4, ale wszystkie cztery twoje greps działają, gdy używasz 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 \snie jest udokumentowane):

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

Radzę unikać używania \s... użyj [ \t]*lub [[:space:]]lub czegoś podobnego zamiast tego.

Kamal
źródło
24
Lub po prostu [:space:]np. w ten sposób:cat file | grep "[[:space:]]"
Kiril Kirov
wydaje się, że jest to błąd w nowszej wersji grepa (z innego punktu widzenia) zgodnie z tym zgłoszeniem błędu mail-archive.com/[email protected]/msg02686.html, ale dlaczego ostatnie stwierdzenie jest zgodne?
Milde
1
@Milde, zwróć uwagę na kolejny post mail-archive.com/[email protected]/msg02689.html, w którym ten raport o błędzie został oznaczony jako nieprawidłowy i zamknięty (więc nie jest to uważane za błąd w nowszym grep).
Kamal
2
@Milde, żadna z analizowanych przeze mnie dokumentów grep (starych lub nowych) nie odnosi się \sw ogóle. Powiedziałbym, że jego zachowanie jest „nieokreślone”. Zamiast tego użyj [: space:], co działa zgodnie z dokumentacją w starym i nowym grep.
Kamal
dzięki, w przyszłości wykorzystam [: space:], aby uniknąć problemu
Milde