นิพจน์ปกติ VS ชื่อไฟล์กำลังหมุน


15

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

คำตอบ:


19

นิพจน์ทั่วไปและชื่อไฟล์ 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จะตีความว่าเป็นนิพจน์ปกติ (โดยการออกแบบ)

เพื่อสรุปให้ดีขึ้นเชลล์จะตีความบรรทัดคำสั่งตามภาษาของตัวเองซึ่งกำลังใช้สัญลักษณ์แทน คำสั่งโปรแกรมแปลความหมายพารามิเตอร์ของตนเองไม่ว่าพวกเขาจะถูกออกแบบโดยผู้เขียนก็ตาม


4

หากชื่อไฟล์เป็นสตริงสำหรับคุณคุณสามารถใช้ regex เช่นเดียวกันกับชื่อไฟล์ ตัวอย่างเช่น: หากคุณต้องการค้นหาชื่อไฟล์ที่ตรงกับ regex คุณสามารถลอง:

find ./ -regex '.*[abc][xyz].*'

คำสั่งค้นหาไฟล์ที่มี a, b หรือ c ในชื่อตามด้วย x, y หรือ z นี่เป็นเพียงตัวอย่างเดียว มีความเป็นไปได้ที่ไม่รู้จบ


แต่ล่ามแตกต่างอย่างไร * ไม่ว่าจะเป็นโจ๊กเกอร์หรือ regex ตัวอย่างเช่น: $ grep a "asterix" b a "asterix" .txt
Hamza

2
ถ้าคุณใช้find ./ -name 'a*'คุณจะใช้ * เป็นสัญลักษณ์แทน เมื่อคุณพิมพ์find ./ -regex 'a*'คุณใช้ * ใน regex ความแตกต่างที่สำคัญคือสวิทช์หรือ-name -regex
ไม่มีใคร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.