grep regex พฤติกรรมการเว้นวรรค


90

ฉันมีไฟล์ข้อความที่มีสิ่งที่ต้องการ:

12,34 EUR 
 5,67 EUR
 ...

มีช่องว่างหนึ่งช่องก่อน "EUR" และฉันไม่สนใจ 0, XX EUR

ฉันเหนื่อย:

grep '[1-9][0-9]*,[0-9]\{2\}\sEUR' => didn't match !

grep '[1-9][0-9]*,[0-9]\{2\} EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s*EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s[E]UR' => worked !

ใครสักคนที่สามารถอธิบายให้ฉัน pls ทำไมฉันไม่สามารถใช้\sแต่\s*และ\s[E]จับคู่?

ระบบปฏิบัติการ: Ubuntu 10.04, grep v2.5

คำตอบ:


124

สิ่งนี้ดูเหมือนความแตกต่างของพฤติกรรมในการจัดการ\sระหว่าง grep 2.5 และเวอร์ชันที่ใหม่กว่า (ข้อผิดพลาดใน grep เก่า?) ฉันยืนยันผลลัพธ์ของคุณด้วย grep 2.5.4 แต่ grep ทั้งสี่ของคุณใช้งานได้เมื่อใช้ grep 2.6.3 (Ubuntu 10.10)

บันทึก:

GNU grep 2.5.4
echo "foo bar" | grep "\s"
   (doesn't match)

ในขณะที่

GNU grep 2.6.3
echo "foo bar" | grep "\s"
foo bar

อาจมีปัญหาน้อยกว่า (ตามที่\sไม่ได้บันทึกไว้):

Both GNU greps
echo "foo bar" | grep "[[:space:]]"
foo bar

คำแนะนำของฉันคือหลีกเลี่ยงการใช้\s... ใช้[ \t]*หรือ[[:space:]]หรือสิ่งที่คล้ายกันแทน


24
หรือเพียงแค่[:space:]สำหรับอดีต ดังนี้cat file | grep "[[:space:]]"
Kiril Kirov

ดูเหมือนว่าจะเป็นข้อบกพร่องใน grep เวอร์ชันใหม่กว่า (มุมมองอื่น ๆ ) ตามคำขอข้อผิดพลาดนี้mail-archive.com/bug-grep@gnu.org/msg02686.htmlแต่เหตุใดคำสั่งสุดท้ายจึงตรงกัน
Milde

1
@Milde โปรดสังเกตว่าโพสต์ติดตามmail-archive.com/bug-grep@gnu.org/msg02689.htmlซึ่งรายงานข้อผิดพลาดนั้นถูกทำเครื่องหมายว่าไม่ถูกต้องและปิด (ดังนั้นจึงไม่ถือว่าเป็นข้อบกพร่องใน grep ที่ใหม่กว่า)
Kamal

2
@Milde ไม่มีเอกสาร grep ที่ฉันตรวจสอบ (เก่าหรือใหม่) อ้างถึง\sเลย ฉันจะบอกว่าพฤติกรรมของมัน "ไม่ได้กำหนด" ใช้ [: space:] แทนซึ่งทำงานตามเอกสารใน grep เก่าและใหม่
Kamal

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