นิพจน์ทั่วไปแตกต่างจากอักขระตัวแทนที่ใช้กรองไฟล์อย่างไร


15

ในขณะที่เราใช้*เพื่อแสดงถึงการเป็นศูนย์หรือตัวอักษรที่ก่อนหน้ามากขึ้นในการgrepที่เราจะใช้*.cในการค้นหาไฟล์ C ทั้งหมดเมื่อเราใช้มันกับคำสั่งเช่นls ls *.cมีคนบอกได้*ไหมว่าการใช้งานแตกต่างกันในสองกรณีนี้อย่างไร

คำตอบ:


30

ชื่อไฟล์ของเชลล์ชื่อ globbingและนิพจน์ทั่วไปใช้อักขระเดียวกันบางตัวและมีวัตถุประสงค์ที่คล้ายกัน แต่คุณพูดถูก ชื่อไฟล์ globbing เป็นระบบที่ทรงพลังน้อยกว่ามาก

ในชื่อไฟล์ globbing:

  • * หมายถึง "ศูนย์หรือมากกว่าตัวละคร"

  • ? แปลว่า "อักขระตัวเดียว"

แต่ใน regexes คุณต้องใช้.*เพื่อหมายถึง "ศูนย์หรือมากกว่าตัวอักษร" และ.หมายถึง "อักขระตัวเดียว" A ?หมายถึงบางสิ่งที่แตกต่างกันใน regexes: ศูนย์หรืออินสแตนซ์หนึ่งขององค์ประกอบ RE ก่อนหน้า

วงเล็บเหลี่ยม ( []) ดูเหมือนว่าจะทำงานได้เหมือนกันในทั้งสองระบบในระบบที่ฉันพิมพ์บนสำหรับกรณีอย่างน้อยที่สุด ซึ่งรวมถึงสิ่งต่าง ๆ เช่นคลาสอักขระ POSIX (เช่น[:alpha:]) ที่กล่าวว่าหากคุณต้องการคำสั่งของคุณเพื่อทำงานกับระบบที่แตกต่างกันฉันขอแนะนำให้ใช้สิ่งอื่นนอกเหนือจากสิ่งที่อยู่ในระดับพื้นฐานเช่นรายการของตัวละคร (เช่น[abeq]) และอาจจะเป็นช่วงของตัวละคร (เช่น[a-c])

ความแตกต่างเหล่านี้หมายถึงทั้งสองระบบสามารถใช้แทนกันได้โดยตรงสำหรับกรณีง่าย ๆ หากคุณต้องการจับคู่ regex ของชื่อไฟล์คุณต้องทำอีกวิธีหนึ่ง find -regexเป็นทางเลือกหนึ่ง (โปรดสังเกตว่ายังมีอีกfind -nameวิธีซึ่งใช้ไวยากรณ์ glob)


2
ฉันไม่รู้ว่ามันถูกเรียกว่า globbing :)
user3539

3
นอกจากนี้ยังมีรสชาติที่หลากหลายของ regex ไม่ใช่ regexes ทั้งหมดที่ถูกสร้างขึ้นมาเหมือนกัน! และคุณมีหลายระบบจับคู่รูปแบบอื่น ๆ เช่น SQL เช่นที่หมายถึง'%' '*'
Mr Lister

4
สองรสชาติหลักของ regexp คือ POSIX และ PCRE (Perl Compatible RE) ภายหลังยืดยาวน้อยและมีคุณสมบัติเพิ่มเติมบางอย่าง เครื่องมือและเชลล์ Unix โดยทั่วไปใช้ POSIX ภาษาการเขียนโปรแกรมส่วนใหญ่ที่มี regexps ในตัว (ยกเว้นเชลล์) ใช้ PCRE เพียงแค่ระวังความแตกต่างเมื่อคุณอ่านเนื้อหาออนไลน์
goldilocks

11

ตอบคำถามที่แสดงในชื่อเดิม:

เหตุใดนิพจน์ทั่วไปต่างจากที่ใช้กรองไฟล์

การขยายชื่อไฟล์ถือเป็นนิพจน์ทั่วไปที่มีอยู่แล้วในระบบปฏิบัติการส่วนใหญ่ (อักขระไวด์การ์ด / ตัวโจ๊กเกอร์) และมีความง่ายและใช้งานง่ายกว่าแบบหลัง

ในขณะที่*.txtผู้ใช้ทั่วไปสามารถเข้าใจได้ง่าย แต่สิ่งที่คล้ายคลึงกัน.*\.txtคือเป้าหมายผู้ใช้ / โปรแกรมเมอร์ที่มีประสบการณ์ไม่ต้องพูดถึง^.*\.txt$...


2
อีกเหตุผลหนึ่งสำหรับส่วน "ทำไม": ความเร็ว นิพจน์ทั่วไปช้าลง: pastebin.com/3iNCgkE3
จัดการข้อมูล

3
*.txtไม่เท่ากัน.*\.txt(ส่วนใหญ่) เท่ากับ.*\.txt$เพราะไม่มีอะไรหลังจาก.txt(อย่างน้อยสมมติชื่อไฟล์ที่เหมาะสมแบบกลม) บางทีก็^.*\.txt$ค่อนข้างจะขึ้นอยู่กับการใช้งาน พิสูจน์จุดของคุณ?
CVn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.