[A-Z]basheşleştirmede, önce Dszsıralayan Ave sıralanan tüm harmanlama öğeleri (karakterler, ancak çağrılar aynı zamanda Macar yerellerindeki gibi karakter dizileri de olabilir ) eşleşir Z. Yerel bölgenizde cmuhtemelen B ve C arasında sıralanır.
$ printf '%s\n' A a á b B c C Ç z Z Ẑ | sort
a
A
á
b
B
c
C
Ç
z
Z
Ẑ
Yani cya zeşleştirileceğini olurdu [A-Z], ancak Ẑya 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 yerelinde, sıra şöyle olacaktır:
$ printf '%s\n' A a á b B c C Ç z Z Ẑ | LC_COLLATE=C sort
A
B
C
Z
a
b
c
z
Ç
á
Ẑ
Yani [A-Z]eşleşir A, B, C, Z, ancak Çhala değil Ẑ.
Büyük harflerle (herhangi bir komut dosyasında) eşleştirmek istiyorsanız, [[:upper:]]bunun yerine kullanabilirsiniz . Latin alfabesindeki bashbüyük harflerle eşleşmenin hiçbir yolu yoktur (ayrı ayrı listelenmesi dışında).
Eğer eşleşme istiyorsanız Aiçin Z İngilizce aksan olmadan mektupları, sen birini kullanabilirsiniz [A-Z]veya [[:upper:]]ancak Cyerel ayar (veri varsayarak birden fazla karakter kodlama vardır BIG5 veya GB18030 gibi karakter setleri kodlanmazsa içeren veya listeyi bu harflerin kodlamasını) ayrı ayrı onları ( [ABCDEFGHIJKLMNOPQRSTUVWXYZ]).
Mermiler arasında bazı değişiklikler olduğunu unutmayın.
İçin zsh, bash -O globasciiranges(garip isimli bash-4.3 tanıtılan opsiyon), schily-shve yash, [A-Z]kod noktası arasındadır karakterler maçları bunun Ave bu Znedenle davranışını eşdeğer olacaktır bashC yereli.
Kül, mksh ve eski kabukları için, zshyukarıdakiyle aynıdır, ancak tek baytlık karakter kümeleriyle sınırlıdır. Bu, örneğin bir UTF-8 yerel ayarında [É-Ź]eşleşmeyecek Ó, ancak bu, [<c3><89>-<c5><b9>]0x89 - 0xc5 bayt değerleriyle eşleşecek!
ksh93bashHer ikisi de küçük harflerle veya büyük harflerle başlayan özel durum aralıkları gibi davranması dışında davranır. Bu durumda, yalnızca bu uçlar arasında sıralama yapan harmanlama öğeleriyle eşleşir, ancak bunlar (veya çok karakterli harmanlama öğeleri için ilk karakterleri) aynı zamanda küçük harflerdir (veya sırasıyla büyük harflerdir). Yani [A-Z]orada eşleşir É, ancak üzerinde eolarak earalarında sıralama yapar Ave Zancak gibi büyük harfe değildir Ave Z.
For fnmatch()desenleri (olduğu gibi find -name '[A-Z]') ya da sistem normal ifadeler (olduğu gibi grep '[A-Z]'), bu sistem ve yerel ayara bağlıdır. Örneğin, burada bir GNU sistemi üzerinde, [A-Z]üzerinde uymuyor xiçinde en_GB.UTF-8yerel ayar, ancak yapar th_TH.UTF-8one. Bunu belirlemek için hangi bilgiyi kullandığı belli değil, ama görünüşe göre LC_COLLATE yerel verilerinden türetilmiş bir arama tablosuna dayanıyor ).
Tüm davranışlara POSIX tarafından izin verilir, çünkü POSIX, C yerel ayarından başka yerel ayarlarda belirtilmeyen aralıkların davranışını bırakır. Şimdi her bir yaklaşımın faydalarını tartışabiliriz.
bashbireyin yaklaşımı olduğu gibi mantıklı bir çok yapar [C-G]biz aradaki karakterleri istiyorum Cve G. Ve aralarındakileri belirleyenler için kullanıcının sıralama düzenini kullanmak en mantıklı yaklaşımdır.
Şimdi, sorun şu ki, birçok insanın, özellikle de Unicode öncesi geleneksel davranışlarda kullanılan insanlar, hatta uluslararasılaşma öncesi günlerin beklentilerini ihlal ediyor. Normal bir kullanıcıdan, bu mayıs mantıklı olsa da [C-I]içermektedir holarak hmektup arasındadır Cve Io [A-g]içermez Z, bu insanlar sadece on yıllardır ASCII icabına bakan için farklı bir konu.
Bu bashdavranış gelen de farklıdır [A-Z](olduğu gibi GNU normal ifadelerde gibi diğer GNU araçları aralığı eşleştirme grep/ sed...) veya fnmatch()olduğu gibi find -name.
Ayrıca, neyin [A-Z]eşleştiğinin çevre, işletim sistemi ve işletim sistemi sürümüne göre değiştiği anlamına gelir . Aslında [A-Z]Á maçları değil z da suboptimaldir.
zsh/ İçin yashfarklı bir sıralama düzeni kullanıyoruz. Kullanıcının karakter sırası kavramına güvenmek yerine, karakter noktası kod değerlerini kullanırız. Bu, anlaşılması kolay olmanın avantajına sahiptir, ancak ASCII dışında, pratik bir kaç noktadan itibaren, pek kullanışlı değildir. [A-Z]ABD-İngilizcesi 26 büyük harf ile, [0-9]ondalık basamaklarla eşleşir. Unicode'da bazı alfabelerin sırasını izleyen kod noktaları vardır, ancak bunlar genelleştirilmemiştir ve aynı şekilde komut dosyası kullanan farklı insanlar mutlaka harflerin sırasını kabul etmemektedir.
Geleneksel kabukları ve mksh, çizgi için, kırıldı (şimdi çoğu insan çok baytlı karakterler kullanıyor), ama öncelikle çok baytlık desteği olmadığı için. Gibi bashve kabukları için çok baytlık destek eklemek zshbüyük bir çaba ve hala devam ediyor. yash(bir Japon kabuğu), başlangıçta çok baytlık destekle tasarlanmıştı.
ksh93'ün yaklaşımı, sistemin normal ifadeleri veya fnmatch () ile tutarlı olma avantajına sahiptir (veya en azından GNU sistemlerinde görünmektedir). Orada, bazılarının [A-Z]küçük harfleri içermediği için beklentilerini bozmaz, [A-Z]içerir É(ve Á, ama Ź). Genel sortolarak strcoll()sipariş ile tutarlı değil .
localeçıktı? Bunu çoğaltamıyorum (touch foo; echo [A-Z]*aksi takdirde boş bir dizine değişmez kalıbı "foo" değil, çıktı olarak verir).