Grep'in temel ifadeleri tarafından desteklenmiyor mu?


119

Bu herhangi bir çıktı üretmez. Nasıl olur?

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

Ancak bunlar:

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

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

2
Bunların hiçbiri benim için çalışmıyor (Solaris).
spraff

Ben de değil. (Cygwin) Olmak mı istedin \+? Bu ne anlama geliyor?
Eric Wilson

evet, Ubuntu 10.04'teyim, bash kullanıyorum. Grep'te BRE için bazı karakterlerden kaçınmanız gerekir. Man grep'de "Temel ve Genişletilmiş Normal İfadeler" i deneyin.
Ankur Agarwal

2
@FarmBoy: +bir normal ifadede "önceki belirteçlerden biri veya daha fazlası" anlamına gelir. Bu durumda, grepvarsayılan regex motorunun gerektirdiği sözdizimi olduğundan kaçtı .
Daenyth

2
@FarmBoy: kullanıyorsanız kaçmanız +gerekir grep; kullanıyorsanız egrep, kullanmaz . grep -Eeşdeğerdir egrep(en azından GNU sürümü için).
Keith Thompson

Yanıtlar:


196

grepvarsayılan modu (iirc) POSIX normal ifadesidir ve pcre'dir \d. -PPerl benzeri düzenli ifadeler için gnu grep'e geçebilir veya [[:digit:]]bunun yerine kullanabilirsiniz \d.

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

10
BSD grep'in -E modu \ d içerir. Ancak GNU grep'in -E modu bunu yapmaz. Bu o kadar göze batan ki şok oldum, şimdi keşfediyorum.
Keith Tyler

> BSD grep'in -E modu şunları içerir \ d. Ancak GNU grep'in -E modu bunu yapmaz. Bu o kadar göze batan ki şok oldum, şimdi keşfediyorum. Bu beni bir git commit mesajı doğrulama betiğinden ısırdı. Suçlu olmasına çok şaşırdım.
austinbruch

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.