Apakah \ d tidak didukung oleh ekspresi dasar grep?

119

Ini tidak menghasilkan keluaran apa pun. Bagaimana bisa?

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

Tapi ini lakukan:

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

$ echo 'this 1 2 3' | grep '\w\+'
this 1 2 3
Ankur Agarwal
sumber
2
Tidak ada yang berhasil untuk saya (Solaris).
spraff
Aku juga tidak. (Cygwin) Apakah Anda bermaksud memiliki \+? Apa artinya?
Eric Wilson
ya, saya menggunakan Ubuntu 10.04, menggunakan bash. Untuk BRE di grep Anda harus keluar dari beberapa karakter. Coba "Ekspresi Reguler Dasar vs Diperluas" di man grep.
Ankur Agarwal
2
@FarmBoy: +dalam regex berarti "satu atau lebih dari token sebelumnya". Dalam kasus ini, itu lolos karena itulah sintaks yang diperlukan oleh grepmesin regex default.
Daenyth
2
@FarmBoy: +perlu di-escape jika Anda menggunakan grep; jika Anda menggunakan egrep, tidak. grep -Esetara dengan egrep(setidaknya untuk versi GNU).
Keith Thompson

Jawaban:

196

grepMode default adalah (iirc) POSIX regex, dan \dpcre. Anda dapat meneruskan -Pke gnu grep, untuk ekspresi reguler seperti perl, atau gunakan [[:digit:]]sebagai gantinya \d.

daenyth@Bragi ~ $ echo 1 | grep -P '\d'
1
daenyth@Bragi ~ $ echo 1 | grep '[[:digit:]]'
1
Daenyth
sumber
10
Mode -E grep BSD mencakup \ d. Tetapi mode -E GNU grep tidak. Itu sangat mencolok, saya terkejut, saya baru menemukannya sekarang.
Keith Tyler
> Mode -E grep BSD menyertakan \ d. Tetapi mode -E GNU grep tidak. Itu sangat mencolok, saya terkejut, saya baru menemukannya sekarang. Ini hanya menggigit saya pada skrip validasi pesan git commit. Saya sangat terkejut \ d pelakunya.
austinbruch
18

Coba ini $ echo 'this 1 2 3' | grep '[0-9]\+'

Charles Ma
sumber
1
mungkin opsi "grep -E" akan membantu
bortunac