[A-Z]
bash
eşleştirmede, önce Dsz
sıralayan A
ve 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 c
muhtemelen 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 c
ya z
eş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 bash
büyük harflerle eşleşmenin hiçbir yolu yoktur (ayrı ayrı listelenmesi dışında).
Eğer eşleşme istiyorsanız A
için Z
İngilizce aksan olmadan mektupları, sen birini kullanabilirsiniz [A-Z]
veya [[:upper:]]
ancak C
yerel 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-sh
ve yash
, [A-Z]
kod noktası arasındadır karakterler maçları bunun A
ve bu Z
nedenle davranışını eşdeğer olacaktır bash
C yereli.
Kül, mksh ve eski kabukları için, zsh
yukarı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!
ksh93
bash
Her 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 e
olarak e
aralarında sıralama yapar A
ve Z
ancak gibi büyük harfe değildir A
ve 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 x
içinde en_GB.UTF-8
yerel ayar, ancak yapar th_TH.UTF-8
one. 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.
bash
bireyin yaklaşımı olduğu gibi mantıklı bir çok yapar [C-G]
biz aradaki karakterleri istiyorum C
ve 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 h
olarak h
mektup arasındadır C
ve I
o [A-g]
içermez Z
, bu insanlar sadece on yıllardır ASCII icabına bakan için farklı bir konu.
Bu bash
davranış 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 yash
farklı 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 bash
ve kabukları için çok baytlık destek eklemek zsh
bü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 sort
olarak 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).