ขอบเขตคำ Grep


22

เอกสารแนบกับ GNU:

‘\<’ Match the empty string at the beginning of word.
‘\>’ Match the empty string at the end of word.

/ etc / fstab ของฉันมีลักษณะเช่นนี้:

/dev/sdb1       /media/fresh      ext2   defaults     0 0

ฉันต้องการให้ grep คืนค่า TRUE / FALSE สำหรับการมีอยู่ของ / media / fresh ผมพยายามที่จะใช้\<และ\>แต่มันก็ไม่ได้ทำงาน ทำไม?

egrep '\</media/fresh\>' /etc/fstab

การแก้ปัญหา:

egrep '[[:blank:]]/media/fresh[[:blank:]]' /etc/fstab

แต่มันดูน่าเกลียด

grep ของฉันคือ 2.5.1


คำตอบ:


27

\<และ\>จับคู่สตริงว่างที่จุดเริ่มต้นและจุดสิ้นสุดของคำตามลำดับและมีเฉพาะอักขระที่เป็นคำเท่านั้น:

[[:alnum:]_]

จากman grep:

Word-constituent characters are letters, digits, and the underscore.

ดังนั้น Regex ของคุณล้มเหลวเพราะ/ไม่ใช่อักขระที่เป็นคำที่ถูกต้อง

คุณสามารถใช้-wตัวเลือกgrepเพื่อจับคู่คำแทน:

grep -wo '/media/fresh' /etc/fstab

ตัวอย่าง:

$ grep -wo '/media/fresh' <<< '/dev/sdb1       /media/fresh      ext2   defaults     0 0'
/media/fresh

ฉันคิดเท่าไหร่หลังจากที่โพสต์คำถาม ข้อเสนอแนะสำหรับสิ่งที่ฉันต้องการที่จะบรรลุ?
Felipe Alvarez

@FelipeAlvarez ตรวจสอบการแก้ไขของฉัน ..
heemayl

1

ปัญหานี้กับ\<(และยัง\b) ใช้ไม่เพียง/แต่กับตัวละครที่ไม่ใช่คำทั้งหมด (เช่นตัวละครอื่นที่ไม่ใช่[[:alnum:]]และ_.)

ปัญหาคือว่าเครื่องยนต์ regex จะเสมอบายพาสอักขระที่ไม่ใช่คำพูดเช่นเมื่อค้นหาสมอถัดไป/ \<ที่ว่าทำไมคุณไม่ควรใส่อักขระที่ไม่ใช่คำพูดเช่นหลังขวา/ \<ถ้าคุณทำโดยการก่อสร้างไม่มีอะไรจะจับคู่

ทางเลือกอื่นสำหรับ-wตัวเลือก grep อาจเป็นดังนี้:

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