Czy \ d nie jest obsługiwane przez podstawowe wyrażenia grepa?


119

Nie generuje to żadnych danych wyjściowych. Dlaczego?

$ echo 'this 1 2 3' | grep '\d\+'

Ale te robią:

$ echo 'this 1 2 3' | grep '\s\+'
this 1 2 3

$ echo 'this 1 2 3' | grep '\w\+'
this 1 2 3

2
Żaden z nich nie działa dla mnie (Solaris).
rozpylanie

Ja też nie. (Cygwin) Czy chciałeś \+? Co to znaczy?
Eric Wilson

tak, korzystam z Ubuntu 10.04 i używam basha. W przypadku BRE w grep musisz uciec od niektórych znaków. Wypróbuj „Podstawowe a rozszerzone wyrażenia regularne” w man grep.
Ankur Agarwal

2
@FarmBoy: +w wyrażeniu regularnym oznacza „jeden lub więcej poprzednich tokenów”. W tym przypadku jest to znak ucieczki, ponieważ jest to składnia wymagana przez grepdomyślny silnik wyrażeń regularnych.
Daenyth

2
@FarmBoy: +należy uciec, jeśli używasz grep; jeśli używasz egrep, nie działa. grep -Ejest równoważne egrep(przynajmniej dla wersji GNU).
Keith Thompson

Odpowiedzi:


196

grepDomyślnym trybem jest (iirc) POSIX regex i \djest to pcre. Możesz albo przekazać -Pdo gnu grep, dla wyrażeń regularnych w stylu perla, albo użyć [[:digit:]]zamiast \d.

daenyth@Bragi ~ $ echo 1 | grep -P '\d'
1
daenyth@Bragi ~ $ echo 1 | grep '[[:digit:]]'
1

10
Tryb -E grepa w BSD zawiera \ d. Ale tryb -E GNU grepa nie. To tak rażące, że jestem w szoku, że właśnie to odkrywam.
Keith Tyler

> Tryb -E grepa w BSD zawiera \ d. Ale tryb -E GNU grepa nie. To tak rażące, że jestem w szoku, że właśnie to odkrywam. To tylko ugryzło mnie w skrypcie walidacji komunikatów git commit. Byłem bardzo zaskoczony, że był winowajcą.
austinbruch

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.