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

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.


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/bug-grep@gnu.org/msg02686.html, ale dlaczego ostatnie stwierdzenie jest zgodne?
Milde

1
@Milde, zwróć uwagę na kolejny post mail-archive.com/bug-grep@gnu.org/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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.