\ d ไม่รองรับนิพจน์พื้นฐานของ grep หรือไม่?


119

สิ่งนี้ไม่สร้างผลลัพธ์ใด ๆ มาได้ยังไง?

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

แต่สิ่งเหล่านี้ทำ:

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

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

2
ไม่มีงานอะไรสำหรับฉัน (Solaris)
spraff

ฉันก็ไม่เหมือนกัน. (Cygwin) คุณหมายถึงมี\+? นั่นหมายความว่าอย่างไร?
Eric Wilson

ใช่ฉันใช้ Ubuntu 10.04 โดยใช้ bash สำหรับ BRE ใน grep คุณต้องหลีกเลี่ยงอักขระบางตัว ลอง "Basic vs Extended Regular Expressions" ใน man grep
Ankur Agarwal

2
@FarmBoy: +ใน regex หมายถึง "โทเค็นก่อนหน้าอย่างน้อยหนึ่งรายการ" ในกรณีนี้จะมีการหลีกเลี่ยงเนื่องจากเป็นไวยากรณ์ที่ต้องการโดยเอ็นgrepจิ้น regex เริ่มต้นของ
Daenyth

2
@FarmBoy: +ต้องหนีถ้าคุณใช้grep; ถ้าคุณใช้egrepมันไม่ได้ grep -Eเทียบเท่ากับegrep(อย่างน้อยสำหรับเวอร์ชัน GNU)
Keith Thompson

คำตอบ:


196

grepโหมดเริ่มต้นของ (iirc) POSIX regex และ\dเป็น pcre คุณสามารถส่งผ่าน-Pไปยัง GNU grep สำหรับ Perl เหมือน regexps หรือใช้แทน[[:digit:]]\d

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

10
โหมด -E ของ BSD grep ประกอบด้วย \ d แต่โหมด -E ของ GNU grep ไม่มี ฉันตกใจมากตอนนี้ฉันเพิ่งค้นพบ
Keith Tyler

> โหมด -E ของ BSD grep ประกอบด้วย \ d แต่โหมด -E ของ GNU grep ไม่มี ฉันตกใจมากตอนนี้ฉันเพิ่งค้นพบ นี่เป็นเพียงแค่บิตฉันในสคริปต์การตรวจสอบข้อความคอมมิตคอมมิต ฉันรู้สึกประหลาดใจมากที่เป็นผู้กระทำผิด
austinbruch

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.