GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Beeinflusst (sollte) Lc_collate Zeichenbereiche?

Sortierreihenfolge durch LC_COLLATE definiert nicht nur die Sortierreihenfolge einzelner Zeichen, sondern auch die Bedeutung von Zeichenbereichen. Oder doch? Betrachten Sie das folgende Snippet:

unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'

Intuitiv B ist nicht in [a-z] , also sollte dies nichts ausgeben. Das passiert auf Ubuntu 8.04 oder 10.04. Aber auf einigen Rechnern, auf denen Debian Lenny oder Squeeze läuft, B gefunden, weil der Bereich a-z enthält alles, was zwischen a steht und z in der Sortierreihenfolge, einschließlich der Großbuchstaben B bis Z .

Alle getesteten Systeme haben den en_US Gebietsschema generiert. Ich habe auch versucht, das Gebietsschema zu variieren:auf den Maschinen, auf denen B oben abgeglichen wird, geschieht dasselbe in jedem verfügbaren Gebietsschema (meistens lateinisch:{en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8} , auch chinesische Sprachumgebungen) mit Ausnahme von Japanisch (in jeder verfügbaren Kodierung) und C /POSIX .

Was bedeuten Zeichenbereiche in regulären Ausdrücken , wenn Sie über ASCII hinausgehen? Warum gibt es einen Unterschied zwischen einigen Debian-Installationen einerseits und anderen Debian-Installationen und Ubuntu andererseits? Wie verhalten sich andere Systeme? Wer hat Recht und wem sollte ein Fehler gemeldet werden?

(Beachten Sie, dass ich speziell nach dem Verhalten von Zeichenbereichen wie [a-z] frage in en_US Gebietsschemas, hauptsächlich auf GNU libc-basierten Systemen. Ich frage nicht, wie Kleinbuchstaben oder ASCII-Kleinbuchstaben abgeglichen werden.)

Auf zwei Debian-Rechnern, einer mit B ist in [a-z] und eine, wo dies nicht der Fall ist, die Ausgabe von LC_COLLATE=en_US locale -k LC_COLLATE ist

collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"

und die Ausgabe von LC_COLLATE=en_US.utf8 locale -k LC_COLLATE ist

collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"

Akzeptierte Antwort:

Wenn Sie etwas anderes als C verwenden locale sollten Sie keine Bereiche wie [a-z] verwenden da diese vom Gebietsschema abhängig sind und nicht immer die erwarteten Ergebnisse liefern. Neben dem Problem der Groß- und Kleinschreibung, auf das Sie bereits gestoßen sind, behandeln einige Gebietsschemata Zeichen mit diakritischen Zeichen (z. B. á ) das gleiche wie das Basiszeichen (dh a ).

Verwenden Sie stattdessen eine benannte Zeichenklasse:

echo B | grep '[[:lower:]]'

Dies wird immer das richtige Ergebnis für das Gebietsschema liefern. Sie müssen jedoch das Gebietsschema auswählen, um die Bedeutung sowohl Ihres Eingabetexts als auch des Tests widerzuspiegeln, den Sie anwenden möchten.

Verwandte:Php:imagechar — Zeichnet ein Zeichen horizontal

Wenn Sie beispielsweise einen bestimmten Bytewert suchen müssen, verwenden Sie den C Gebietsschema, das immer verfügbar ist:

echo B | LANG=C grep '[a-z]'

Wenn dies nicht wie erwartet funktioniert, handelt es sich wirklich um einen Fehler.


Linux
  1. Warum funktioniert der reguläre Ausdruck in X, aber nicht in Y?

  2. Was macht „lc_all=c“?

  3. Was macht ?

  4. Beeinflusst LVM die Leistung?

  5. Was bedeutet Exec 3?

Was bedeutet Echo $? Tun??

Beeinflusst „concurrency_level=x“ alle mit Make erstellten Kompilationen?

Was ist PIPEDA im Jahr 2022 und wie wirkt es sich auf Hosting-Provider aus?

Was gibt malloc(0) zurück?

wc -l zählt NICHT zuletzt in der Datei, wenn es kein Zeilenendezeichen hat

Sollte ich versuchen, meine Threads auszugleichen, oder tut Linux dies?