[A-Z]
ในbash
การแข่งขันทั้งหมดเรียงองค์ประกอบ (ตัวละคร แต่ยังเรียกเป็นลำดับของตัวอักษรเช่นDsz
ในตำแหน่งที่ฮังการี) ที่จัดเรียงหลังและจัดเรียงก่อนA
Z
ในสถานที่ของคุณc
อาจเรียงลำดับระหว่าง B และ C
$ printf '%s\n' A a á b B c C Ç z Z Ẑ | sort
a
A
á
b
B
c
C
Ç
z
Z
Ẑ
ดังนั้นc
หรือz
จะได้รับการจับคู่โดย[A-Z]
แต่ไม่ได้หรือẐ
a
$ printf '%s\n' A a á b B c C Ç z Z Ẑ |
pipe> bash -c 'while IFS= read -r x; do case $x in [A-Z]) echo "$x"; esac; done'
A
á
b
B
c
C
Ç
z
Z
ในโลแคล C ลำดับจะเป็น:
$ printf '%s\n' A a á b B c C Ç z Z Ẑ | LC_COLLATE=C sort
A
B
C
Z
a
b
c
z
Ç
á
Ẑ
ดังนั้น[A-Z]
จะตรงกับA
, B
, C
, Z
แต่ไม่ได้และยังไม่Ç
Ẑ
หากคุณต้องการจับคู่กับตัวอักษรตัวพิมพ์ใหญ่ (ในสคริปต์ใด ๆ ) คุณสามารถใช้[[:upper:]]
แทน ไม่มีวิธีในตัวในbash
การจับคู่ตัวอักษรตัวพิมพ์ใหญ่ในสคริปต์ละตินเท่านั้น (ยกเว้นการแสดงรายการเป็นรายบุคคล)
หากคุณต้องการจับคู่A
กับตัวอักษรZ
ภาษาอังกฤษโดยไม่มีการออกเสียงคุณสามารถใช้[A-Z]
หรือ[[:upper:]]
แต่ในC
โลแคล (สมมติว่าข้อมูลไม่ได้เข้ารหัสในชุดอักขระเช่น BIG5 หรือ GB18030 ซึ่งมีอักขระหลายตัวซึ่งการเข้ารหัสประกอบด้วยการเข้ารหัสของตัวอักษรเหล่านั้น) หรือรายการ พวกเขาเป็นรายบุคคล ( [ABCDEFGHIJKLMNOPQRSTUVWXYZ]
)
โปรดทราบว่ามีการเปลี่ยนแปลงบางอย่างระหว่างเปลือกหอย
สำหรับzsh
, bash -O globasciiranges
(ตัวเลือกชื่อแปลกแนะนำในทุบตี-4.3), schily-sh
และyash
, [A-Z]
ตรงกับตัวอักษรที่มีจุดรหัสอยู่ระหว่างที่A
และที่ของZ
เพื่อจะเทียบเท่ากับการทำงานของbash
ในภาษาซี
สำหรับเถ้า, mksh และกระสุนโบราณเช่นเดียวกับzsh
ข้างบน แต่ จำกัด อยู่ที่ charsets ไบต์เดียว นั่นคือในโลแคล UTF-8 [É-Ź]
จะไม่ตรงกันÓ
แต่เนื่องจาก[<c3><89>-<c5><b9>]
นั่นจะตรงกับค่าไบต์ 0x89 ถึง 0xc5!
ksh93
ประพฤติตัวเหมือนbash
ยกเว้นว่ามันจะถือว่าเป็นกรณีพิเศษช่วงที่ปลายทั้งสองเริ่มต้นด้วยตัวอักษรตัวพิมพ์เล็กหรือตัวอักษรตัวพิมพ์ใหญ่ ในกรณีนั้นมันจะจับคู่เฉพาะกับองค์ประกอบการเรียงที่เรียงลำดับระหว่างปลายเหล่านั้น แต่นั่นคือ (หรืออักขระตัวแรกของพวกเขาสำหรับองค์ประกอบการเรียงหลายตัวละคร) ยังตัวพิมพ์เล็ก (หรือตัวพิมพ์ใหญ่ตามลำดับ) ดังนั้น[A-Z]
ก็จะตรงกับในÉ
แต่ไม่ได้อยู่ในe
ฐานะe
ที่ไม่เรียงลำดับระหว่างA
และZ
ได้ แต่ไม่เป็นตัวพิมพ์ใหญ่เหมือนและA
Z
สำหรับfnmatch()
รูปแบบ (ในfind -name '[A-Z]'
) หรือนิพจน์ทั่วไปของระบบ (ดังในgrep '[A-Z]'
) มันขึ้นอยู่กับระบบและสถานที่ ตัวอย่างเช่นในระบบ GNU ที่นี่[A-Z]
ไม่ตรงกับx
ในen_GB.UTF-8
ภาษา แต่จะอยู่ในระบบth_TH.UTF-8
เดียว มันไม่ชัดเจนสำหรับฉันเกี่ยวกับข้อมูลที่ใช้ในการพิจารณา แต่เห็นได้ชัดว่าอิงจากตารางการค้นหาที่ได้มาจากข้อมูลโลแคล LC_COLLATE )
ลักษณะการทำงานทั้งหมดได้รับอนุญาตจาก POSIX เนื่องจาก POSIX จะหยุดการทำงานของช่วงที่ไม่ได้ระบุไว้ในสถานที่อื่นนอกเหนือจากภาษา C ตอนนี้เราสามารถโต้แย้งข้อดีของแต่ละวิธีได้
bash
วิธีการ 's ทำให้ความรู้สึกมากเช่นเดียวกับ[C-G]
ที่เราต้องการตัวอักษรในระหว่างและC
G
และการใช้ลำดับการจัดเรียงของผู้ใช้สำหรับสิ่งที่กำหนดว่าอะไรที่อยู่ในระหว่างนั้นเป็นแนวทางที่มีเหตุผลที่สุด
ตอนนี้ปัญหาคือว่ามันทำลายความคาดหวังของผู้คนจำนวนมากโดยเฉพาะอย่างยิ่งคนที่เคยชินกับพฤติกรรมดั้งเดิมของ pre-Unicode แม้กระทั่งวันก่อนสากล ขณะที่จากผู้ใช้ปกติก็อาจทำให้รู้สึกว่า[C-I]
รวมถึงh
เป็นh
ตัวอักษรที่อยู่ในระหว่างC
และI
และ[A-g]
ไม่รวมZ
มันเป็นเรื่องที่แตกต่างกันสำหรับคนที่มีการจัดการกับ ASCII เพียงมานานหลายทศวรรษ
ว่าbash
พฤติกรรมยังจะแตกต่างจาก[A-Z]
การจับคู่ในช่วงเครื่องมือ GNU อื่น ๆ เช่นในการแสดงออกปกติ GNU (ในgrep
/ sed
... ) หรือในขณะที่fnmatch()
find -name
นอกจากนี้ยังหมายความว่าสิ่งที่[A-Z]
ตรงกันต่างกันไปตามสภาพแวดล้อมกับระบบปฏิบัติการและรุ่นของระบบปฏิบัติการ ความจริงที่[A-Z]
ตรงกับÁ แต่ไม่ใช่Źนั้นก็ไม่ได้ผลเช่นกัน
สำหรับzsh
/ yash
เราใช้ลำดับการจัดเรียงที่แตกต่างกัน แทนที่จะพึ่งพาความคิดของผู้ใช้เกี่ยวกับลำดับตัวอักษรเราใช้ค่ารหัสจุดอักขระ มันมีประโยชน์ในการเข้าใจง่าย แต่จากจุดที่มีประโยชน์น้อยนอกเหนือจาก ASCII มันไม่ได้มีประโยชน์มาก [A-Z]
ตรงกับตัวอักษรตัวพิมพ์ใหญ่ภาษาอังกฤษแบบอเมริกัน 26 ตัว[0-9]
ตรงกับตัวเลขทศนิยม มีจุดรหัสใน Unicode ที่เป็นไปตามลำดับของตัวอักษรบางตัว แต่นั่นไม่ใช่แบบทั่วไปและไม่สามารถเป็นแบบทั่วไปได้อย่างไรก็ตามคนอื่นที่ใช้สคริปต์เดียวกันไม่จำเป็นต้องเห็นด้วยกับลำดับตัวอักษร
สำหรับเชลล์แบบดั้งเดิมและ mksh ให้ใช้งานไม่ได้ (ตอนนี้คนส่วนใหญ่ใช้อักขระหลายไบต์) แต่ส่วนใหญ่เป็นเพราะพวกเขายังไม่รองรับหลายไบต์ การเพิ่มการสนับสนุนหลายไบต์ให้กับเชลล์เช่นนี้bash
และzsh
เป็นความพยายามอย่างมากและยังคงดำเนินอยู่ yash
(เชลล์ญี่ปุ่น) เริ่มแรกด้วยการสนับสนุนหลายไบต์ตั้งแต่เริ่มต้น
วิธีการของ ksh93 มีประโยชน์ที่จะสอดคล้องกับการแสดงออกปกติของระบบหรือ fnmatch () (หรืออย่างน้อยก็ปรากฏเป็นอย่างน้อยในระบบ GNU) ที่นั่นจะไม่ทำลายความคาดหวังของบางคนเนื่องจาก[A-Z]
ไม่มีตัวอักษรตัวพิมพ์เล็ก[A-Z]
รวมถึงÉ
(และÁ แต่ไม่ใช่Ź) มันไม่สอดคล้องกับคำสั่งsort
หรือโดยทั่วไปstrcoll()
locale
เอาท์พุท? ฉันไม่สามารถทำซ้ำสิ่งนี้ (touch foo; echo [A-Z]*
แสดงรูปแบบตัวอักษรไม่ใช่ "foo" ในไดเรกทอรีว่างเปล่า)