ปัญหา regex ของ grep 'OR'


65

ฉันพยายามใช้ grep กับ regex เพื่อค้นหาบรรทัดในไฟล์ที่ตรงกับ 1 ใน 2 สตริงที่เป็นไปได้ นี่คือ grep ของฉัน:

$ grep "^ID.*(ETS|FBS)" my_file.txt

grep ด้านบนไม่แสดงผลลัพธ์ใด ๆ อย่างไรก็ตามหากฉันดำเนินการอย่างใดอย่างหนึ่ง:

$ grep "^ID.*ETS" my_file.txt  

หรือ

$ grep "^ID.*FBS" my_file.txt  

ฉันจะจับคู่บรรทัดที่เฉพาะเจาะจง เพราะเหตุใด OR regex ของฉันจึงไม่ตรงกัน ขอบคุณล่วงหน้าสำหรับความช่วยเหลือ!

คำตอบ:


94

ด้วย regex ปกติตัวละคร(, |และ)จะต้องมีการหลบหนี ดังนั้นคุณควรใช้

$ grep "^ID.*\(ETS\|FBS\)" my_file.txt

คุณไม่จำเป็นต้องใช้ Escape เมื่อคุณใช้ตัวเลือกเพิ่มเติม regex ( -E) ดูman grepหัวข้อ " Basic vs Extended Regular Expressions"


10
นอกจากนี้คุณยังสามารถใช้แทนegrep grep -E
Riccardo Murri

2
@RiccardoMurri คำตอบของ Michal ระบุว่า egrep (และ fgrep) เลิกใช้แล้ว (แม้ว่าพวกเขาอาจยังใช้งานได้)
Timo

27

หากคุณต้องการใช้หลายสาขา ( |เช่นor) เพื่อให้สามารถใช้งานร่วมกันได้ดียิ่งขึ้นถ้าคุณต้องการใช้ "modern RE" ERE

ในการทำเช่นนั้นให้ใช้grep -E :

grep -E "^ID.*(ETS|FBS)" my_file.txt

ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ RE, ERE และทั้ง "ทันสมัย" เรื่อง ER man 7 regexเห็น

หรือคุณสามารถใช้egrepแทนได้grepแต่คุณสามารถอ่านได้จากman grep:

egrep เหมือนกับ grep -E fgrep เหมือนกับ grep -F

( ... )

การร้องขอโดยตรงเช่นegrepหรือfgrepนั้นไม่รองรับ


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