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
Ankur Agarwal
źródło
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
Daenyth
źródło
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
18

Spróbuj tego $ echo 'this 1 2 3' | grep '[0-9]\+'

Charles Ma
źródło
1
może opcja "grep -E" pomoże
bortunac