Dies ist eine Hausaufgabenfrage:
Ordnen Sie allen Dateinamen 2 oder mehr Zeichen zu, die mit einem Kleinbuchstaben beginnen, aber nicht mit einem Großbuchstaben enden.
Ich verstehe nicht, warum meine Lösung nicht funktioniert.
Also habe ich folgendes ausgeführt:
touch aa
touch ha
touch ah
touch hh
touch a123e
touch hX
touch Ax
ls [a-z]*[!A-Z]
Ausgabe:
aa ha
Meine Frage: Warum stimmte es nicht mit "ah", "hh" oder "a123e" überein?
mksh
Schale, aber nichtbash --posix
, also muss es eine spezielle Regel für Bash gebenmksh
wiezsh
's[A-Z]
passtÉ
zum Beispiel nicht auf . Die[A-Z]
Übereinstimmungen von ksh93 sind aktiviert,É
aber nicht aktivierth
.Antworten:
Dies ist ein Problem mit dem Gebietsschema . Erweitert in Ihrem Gebietsschema
[A-Z]
auf etwas wie[AbBcZ...zZ]
(und wahrscheinlich auch auf andere wie Zeichen mit Akzent) und[^A-Z]
bedeutet dahera
in Ihrem Beispiel (und nur in Ihrem Beispiel) "Dateien, die mit " enden .Wenn Sie eine solche Überraschung vermeiden möchten, müssen Sie eine Möglichkeit festlegen,
LC_COLLATE=C
da die Sortierung der Teil Ihrer Gebietsschemaeinstellungen ist, der für die Sortierreihenfolge verantwortlich ist. Auch leer,LC_ALL
wenn es gesetzt ist, da es Vorrang haben würde.Oder, besser, es ist wahrscheinlich vorzuziehen, die Gebietsschemaeinstellungen nicht zu ändern und die entsprechenden Klassen zu verwenden:
[:lower:]
anstelle von[a-z]
und[:upper:]
anstelle von[A-Z]
.Oder verwenden Sie die
globasciiranges
Option von bash :quelle
LC_ALL=C ls [a-z]*[^A-Z]
würde nur dasls
Gebietsschema beeinflussen, nicht das Gebietsschema, das von der Shell verwendet wird, um den Glob zu erweitern oder diese Befehlszeile zu analysieren.LC_xxx
damit es auf den Glob angewendet wird, aber es wäre vorzuziehen, damit ls das gleiche Gebietsschema erhält.test-鏏
zum Beispiel , weil , sobald Sie das charset zu dem dem C locale ändern,鏏
wird<0xe7>A
. IOW, wenn Sie LC_CTYPE ändern, erhalten Sie unterschiedliche Zeichen.é
,Á
(aber wahrscheinlich nichtŹ
). IOW[A-Z]
macht die Verwendung außerhalb des Gebietsschemas C wenig Sinn.