ในขณะที่เราใช้*
เพื่อแสดงถึงการเป็นศูนย์หรือตัวอักษรที่ก่อนหน้ามากขึ้นในการ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$
ค่อนข้างจะขึ้นอยู่กับการใช้งาน พิสูจน์จุดของคุณ?