\ D không được hỗ trợ bởi các biểu thức cơ bản của grep?


118

Điều này không tạo ra bất kỳ đầu ra. Làm thế nào mà?

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

Nhưng những điều này làm:

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

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

2
Không ai trong số đó làm việc cho tôi (Solaris).
spraff

Tôi cũng không. (Cygwin) Ý của bạn là có \+? Điều đó nghĩa là gì?
Eric Wilson

vâng, tôi đang dùng Ubuntu 10.04, sử dụng bash. Đối với BRE trong grep, bạn phải thoát một số ký tự. Hãy thử "Cơ bản so với biểu thức chính quy mở rộng" trong man grep.
Ankur Agarwal

2
@FarmBoy: +trong regex có nghĩa là "một hoặc nhiều mã thông báo trước". Trong trường hợp này, nó đã thoát vì đó là cú pháp được yêu cầu bởi grepcông cụ regex mặc định.
Daenyth

2
@FarmBoy: +cần phải được thoát nếu bạn đang sử dụng grep; nếu bạn đang sử dụng egrep, nó không. grep -Etương đương với egrep(ít nhất là đối với phiên bản GNU).
Keith Thompson

Câu trả lời:


196

grepChế độ mặc định của (iirc) POSIX regex và \dlà pcre. Bạn có thể chuyển qua -Pgnu grep, cho regexps giống như perl, hoặc sử dụng [[:digit:]]thay vì \d.

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

10
Chế độ -E của BSD grep bao gồm \ d. Nhưng chế độ -E của GNU grep thì không. Điều đó thật đáng kinh ngạc Tôi bị sốc Tôi mới phát hiện ra nó.
Keith Tyler

> Chế độ -E của BSD grep bao gồm \ d. Nhưng chế độ -E của GNU grep thì không. Điều đó thật đáng kinh ngạc Tôi bị sốc Tôi mới phát hiện ra nó. Điều này chỉ cắn tôi trên một kịch bản xác nhận tin nhắn cam kết git. Tôi đã rất ngạc nhiên \ d là thủ phạm.
austinbruch

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.