ในขณะที่เราใช้*เพื่อแสดงถึงการเป็นศูนย์หรือตัวอักษรที่ก่อนหน้ามากขึ้นในการgrepที่เราจะใช้*.cในการค้นหาไฟล์ C ทั้งหมดเมื่อเราใช้มันกับคำสั่งเช่นls ls *.cมีคนบอกได้*ไหมว่าการใช้งานแตกต่างกันในสองกรณีนี้อย่างไร
ในขณะที่เราใช้*เพื่อแสดงถึงการเป็นศูนย์หรือตัวอักษรที่ก่อนหน้ามากขึ้นในการgrepที่เราจะใช้*.cในการค้นหาไฟล์ C ทั้งหมดเมื่อเราใช้มันกับคำสั่งเช่นls ls *.cมีคนบอกได้*ไหมว่าการใช้งานแตกต่างกันในสองกรณีนี้อย่างไร
คำตอบ:
ชื่อไฟล์ของเชลล์ชื่อ globbingและนิพจน์ทั่วไปใช้อักขระเดียวกันบางตัวและมีวัตถุประสงค์ที่คล้ายกัน แต่คุณพูดถูก ชื่อไฟล์ globbing เป็นระบบที่ทรงพลังน้อยกว่ามาก
ในชื่อไฟล์ globbing:
* หมายถึง "ศูนย์หรือมากกว่าตัวละคร"
? แปลว่า "อักขระตัวเดียว"
แต่ใน regexes คุณต้องใช้.*เพื่อหมายถึง "ศูนย์หรือมากกว่าตัวอักษร" และ.หมายถึง "อักขระตัวเดียว" A ?หมายถึงบางสิ่งที่แตกต่างกันใน regexes: ศูนย์หรืออินสแตนซ์หนึ่งขององค์ประกอบ RE ก่อนหน้า
วงเล็บเหลี่ยม ( []) ดูเหมือนว่าจะทำงานได้เหมือนกันในทั้งสองระบบในระบบที่ฉันพิมพ์บนสำหรับกรณีอย่างน้อยที่สุด ซึ่งรวมถึงสิ่งต่าง ๆ เช่นคลาสอักขระ POSIX (เช่น[:alpha:]) ที่กล่าวว่าหากคุณต้องการคำสั่งของคุณเพื่อทำงานกับระบบที่แตกต่างกันฉันขอแนะนำให้ใช้สิ่งอื่นนอกเหนือจากสิ่งที่อยู่ในระดับพื้นฐานเช่นรายการของตัวละคร (เช่น[abeq]) และอาจจะเป็นช่วงของตัวละคร (เช่น[a-c])
ความแตกต่างเหล่านี้หมายถึงทั้งสองระบบสามารถใช้แทนกันได้โดยตรงสำหรับกรณีง่าย ๆ หากคุณต้องการจับคู่ regex ของชื่อไฟล์คุณต้องทำอีกวิธีหนึ่ง find -regexเป็นทางเลือกหนึ่ง (โปรดสังเกตว่ายังมีอีกfind -nameวิธีซึ่งใช้ไวยากรณ์ glob)
'%' '*'
ตอบคำถามที่แสดงในชื่อเดิม:
เหตุใดนิพจน์ทั่วไปต่างจากที่ใช้กรองไฟล์
การขยายชื่อไฟล์ถือเป็นนิพจน์ทั่วไปที่มีอยู่แล้วในระบบปฏิบัติการส่วนใหญ่ (อักขระไวด์การ์ด / ตัวโจ๊กเกอร์) และมีความง่ายและใช้งานง่ายกว่าแบบหลัง
ในขณะที่*.txtผู้ใช้ทั่วไปสามารถเข้าใจได้ง่าย แต่สิ่งที่คล้ายคลึงกัน.*\.txtคือเป้าหมายผู้ใช้ / โปรแกรมเมอร์ที่มีประสบการณ์ไม่ต้องพูดถึง^.*\.txt$...
*.txtไม่เท่ากัน.*\.txt(ส่วนใหญ่) เท่ากับ.*\.txt$เพราะไม่มีอะไรหลังจาก.txt(อย่างน้อยสมมติชื่อไฟล์ที่เหมาะสมแบบกลม) บางทีก็^.*\.txt$ค่อนข้างจะขึ้นอยู่กับการใช้งาน พิสูจน์จุดของคุณ?