ฉันรู้ว่านิพจน์ทั่วไปนั้นจะต้องใช้กับตัวละครและสตริงเท่านั้น แต่บางครั้งฉันก็พบพวกมันในชื่อไฟล์ คำถามของฉันคือ 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