Auf bash:
$ LC_ALL=C
$ ls
bar BAT cab foo ieee2000 MAC moc test zac zara ZOO
$ ls *[a-z]
bar cab foo moc test zac zara
$ ls *[bd-z]
bar cab foo test
$ ls *[^cC]
bar BAT cab foo ieee2000 test zara ZOO
$ ls *[^bc]
bar BAT foo ieee2000 MAC test zara ZOO
Da diese shell expansions sind, können Sie diese auch in Schleifen verwenden usw. relativ leicht.
Notiere die LC_ALL=C
Einstellung - wenn Sie eine nicht-englischen Gebietsschema verwenden es erforderlich sein, um möglicherweise korrekte Ergebnisse zu produzieren:
$ echo $LC_COLLATE
en_US.UTF-8
$ ls *[a-z]
bar BAT cab foo MAC moc test zac zara ZOO
$ LC_COLLATE=C
$ ls *[a-z]
bar cab foo moc test zac zara
Wie in der Probe gesehen oberhalb Sie die speziellere LC_COLLATE
Variable kann stattdessen von LC_ALL
.
EDIT:
By the way, zumindest auf meinem System (Mandriva Linux 2010.1), das Gebietsschema wirkt sich auch auf grep
:
$ LC_COLLATE=en_US.UTF-8
$ echo A | grep '[a-z]'
A
$ LC_COLLATE=C
$ echo A | grep '[a-z]'
$
Ich glaube nicht, dass es keine Schauplätze (noch im Einsatz) wo '* [bd-z]' würde anders zusammenpassen. Sicherlich keine UTF-8 Locales. – ephemient
@ephemient: siehe meine Bearbeitung für ein Beispiel – thkala
Hmm, du hast recht. 'fnmatch' wendet die Sortierung auf Bereiche an, aber nicht auf' [x] 'einzelne Zeichen (was mich zu dem oben Gesagten führte). Das scheint ein Fehler zu sein. – ephemient