Unix-Sortierung behandelt '-' (Bindestrich-) Zeichen als unsichtbar


8

Eine Datei mit Zeilen (aa ac ab) Unix wird nach (aa ab ac) anstelle der erwarteten (ab aa ac) sortiert.

Es ist, als würde sort das Zeichen '-' ignorieren.

Interessanterweise ist ein Bindestrich für sich genommen korrekt sortiert (abc -) und sortiert nach (- abc).

Warum? trotzdem, um dieses Verhalten zu ändern?

unix 

Ich hatte den gleichen Effekt, bei dem a <und >Zeichen ignoriert wurden (am Anfang von Zeilen aus einem Diff). :(
Kombinator

Antworten:


13

Das Sortierreihenfolgeverhalten von sort (1) wird durch Ihre Gebietsschemaeinstellungen gesteuert (siehe man locale).

Es gibt verschiedene Ländereinstellungen, zum Beispiel:

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
...
LC_ALL=

Um das gewünschte Sortierverhalten auszuwählen, müssen Sie den richtigen LC_COLLATE-Wert auswählen. In diesem Fall ist das in C (POSIX) integrierte Standardgebietsschema geeignet:

$ sort testcase
aa
a-b
ac

$ LC_COLLATE=C sort testcase
a-b
aa
ac

Wenn Sie möchten, können Sie alle Gebietsschemaeinstellungen festlegen (wodurch sie konsistenter sind), indem Sie LC_ALL = C festlegen. Da es sich um Umgebungsvariablen handelt, können Sie Ihre Sortierreihenfolge mit export LC_ALL=Coder ähnlich in Ihrem Shell-Startskript dauerhaft festlegen .


2

Das Setzen der Umgebungsvariablen LC_ALL = C ändert das Sortierverhalten. Die Standardreihenfolge für das Gebietsschema muss speziell '-' behandeln.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.