ฉันรู้ว่านิพจน์ทั่วไปนั้นจะต้องใช้กับตัวละครและสตริงเท่านั้น แต่บางครั้งฉันก็พบพวกมันในชื่อไฟล์ คำถามของฉันคือ regexes ใช้เฉพาะกับตัวละครหรือชื่อไฟล์ด้วยหรือไม่
ฉันรู้ว่านิพจน์ทั่วไปนั้นจะต้องใช้กับตัวละครและสตริงเท่านั้น แต่บางครั้งฉันก็พบพวกมันในชื่อไฟล์ คำถามของฉันคือ regexes ใช้เฉพาะกับตัวละครหรือชื่อไฟล์ด้วยหรือไม่
คำตอบ:
นิพจน์ทั่วไปและชื่อไฟล์ globbing เป็นสองสิ่งที่แตกต่างกันมาก
การแสดงออกปกติจะใช้ในคำสั่ง / ฟังก์ชั่นสำหรับการจับคู่รูปแบบในข้อความ ตัวอย่างเช่นในพารามิเตอร์รูปแบบของgrepหรือในภาษาการเขียนโปรแกรม
เชลล์ชื่อ globbing ถูกใช้โดยเชลล์สำหรับการจับคู่ชื่อไฟล์และไดเรกทอรีโดยใช้สัญลักษณ์แทน ความสามารถของการหมุนรอบขึ้นอยู่กับเปลือก ตัวอย่างเช่น Bash สนับสนุน wildcard เช่น:
* ตรงกับ 0 หรือมากกว่าตัวละคร? ตรงกับ 1 ตัวอักษร[...] จับคู่อักขระในชุดที่ระบุอักขระตัวแทนเหล่านี้อาจมีลักษณะคล้ายกับนิพจน์ทั่วไปซึ่ง[...]มีความหมายเหมือนกันในการปัดเศษและ regex แต่*และ?หมายถึงสิ่งต่าง ๆ ใน globbing และ regex
ในความคิดเห็นที่คุณเขียน:
แต่ล่ามแตกต่างอย่างไร * ไม่ว่าจะเป็นโจ๊กเกอร์หรือ regex ตัวอย่างเช่น:
grep a*b a*.txt?
ง่าย. เรียงจาก
ก่อนอื่นเชลล์พยายามตีความสัญลักษณ์แทนด้วยการจับคู่กับชื่อไฟล์ หากมีไฟล์ที่ขึ้นต้นด้วย "a" และลงท้ายด้วย "b" เชลล์จะแทนที่a*bด้วยชื่อไฟล์ที่ตรงกัน a*.txtเดียวกันจะไปสำหรับ หากไม่มีชื่อไฟล์ที่ตรงกันเชลล์จะส่งอาร์กิวเมนต์ให้grepเหมือนเดิม
อย่างไรก็ตามพารามิเตอร์แรกของgrepควรเป็นรูปแบบ ใน 99.999% ของกรณีการใช้งานจริงคุณไม่ต้องการให้พารามิเตอร์แรกถูกตีความโดยเชลล์ ดังนั้นความตั้งใจที่สุดก็คือ:
grep "a*b" a*.txt
ขอขอบคุณที่อ้างa*bเปลือกจะไม่ตีความมันโดยใช้ globbing grepและแทนที่จะผ่านโดยตรงไปยัง ในทางกลับกันgrepจะตีความว่าเป็นนิพจน์ปกติ (โดยการออกแบบ)
เพื่อสรุปให้ดีขึ้นเชลล์จะตีความบรรทัดคำสั่งตามภาษาของตัวเองซึ่งกำลังใช้สัญลักษณ์แทน คำสั่งโปรแกรมแปลความหมายพารามิเตอร์ของตนเองไม่ว่าพวกเขาจะถูกออกแบบโดยผู้เขียนก็ตาม
หากชื่อไฟล์เป็นสตริงสำหรับคุณคุณสามารถใช้ regex เช่นเดียวกันกับชื่อไฟล์ ตัวอย่างเช่น: หากคุณต้องการค้นหาชื่อไฟล์ที่ตรงกับ regex คุณสามารถลอง:
find ./ -regex '.*[abc][xyz].*'
คำสั่งค้นหาไฟล์ที่มี a, b หรือ c ในชื่อตามด้วย x, y หรือ z นี่เป็นเพียงตัวอย่างเดียว มีความเป็นไปได้ที่ไม่รู้จบ
find ./ -name 'a*'คุณจะใช้ * เป็นสัญลักษณ์แทน เมื่อคุณพิมพ์find ./ -regex 'a*'คุณใช้ * ใน regex ความแตกต่างที่สำคัญคือสวิทช์หรือ-name -regex