Linux“ find -regex” ไม่จัดการการผูก


2

ฉันมีไฟล์ต่อไปนี้และจำเป็นต้องจับคู่กับไฟล์เหล่านั้นเช่น:

./foo.bar1.sh       -match

./qux/foo.bar2.sh   -match

./foo.sh            -match

./baz.sh            -no match

./foo.bar3          -no match

ฉันเหนื่อย:

หา -regex ". * foo (แถบ [0-9]) ?. sh"

แต่มันจะไม่ส่งคืนอะไรเลย ฉันไม่ทราบสาเหตุที่ regex ใช้งานไม่ได้ ... ช่วยด้วย?

คำตอบ:


2

นิพจน์ทั่วไปของคุณมีข้อผิดพลาดสองประการ:

  1. มันหายไปหลังจากจุด (ตัวอักษร) foo.

  2. find คุณต้องหลีกเลี่ยงวงเล็บเมื่อ ไม่ ใช้เป็นวงเล็บที่แท้จริง

นอกจากนี้คุณควรหลีกเลี่ยงจุดก่อนหน้า shเพราะมันจะจับคู่กับตัวละครใด ๆ

ตอนนี้คำสั่งคงที่จะอ่าน:

find . -regex ".*foo\(\.bar[0-9]\)?\.sh"

ข้อผิดพลาด 2. โดยวิธีการคือเหตุผลที่ฉันไม่ชอบ find 's -regex switch: การหลบหนีไม่สอดคล้องกัน

มันใช้งานได้แน่นอน แต่ grep -P ใช้ Perl Compatible Regular Expressions (PCRE) ดังนั้นจึงมีคุณสมบัติเพิ่มเติม แต่มีเซอร์ไพรส์และข้อผิดพลาดน้อยลง

ส่วนตัวฉันจะใช้:

find . | grep -P "foo(\.bar\d)?\.sh"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.