Сортировка с учетом символов underscore и др. в Ubuntu

В Xubuntu 16.04 по-умолчанию сортировка происходит без учета символов ., _ и !.

Можно заглянуть в мануалы:

# man locale

Про сортировку ничего нет.

# man sort

*** WARNING *** The locale specified by the environment affects sort order. Set LC_ALL=C to get the traditional sort order that uses native byte values.

*** ВНИМАНИЕ *** На сортировку влияют установки локали. Установите переменную окружения LC_ALL=C, чтобы получить обычную сортировку в том порядке, который использует действительные значения байт.

# man bash

LC_COLLATE This variable determines the collation order used when sorting the results of pathname expansion, and determines the behavior of range expressions, equivalence classes, and collating sequences within pathname expansion and pattern matching.

Чуть подробнее тут:

LC_COLLATE: порядок сортировки

Эта переменная отвечает за правила определения сравнения наборов символов, которые используются для сортировки и регулярных выражений.

Установка значения LC_COLLATE=C, например, приведет к тому, что команда ls будет располагать файлы, имена которых начинаются с точки, первыми, за ними последуют имена, начинающиеся с цифры, затем с заглавной и, наконец, со строчной буквы.

Короче, нужно установить переменную окружения LC_COLLATE.

Как я понял, это можно несколькими способами. Я воспользовался третьим (не забудьте потом перезапустить сеанс).

1) редактирование /etc/locale.conf

# nano /etc/locale.conf

LC_COLLATE=C

2) воспользоваться export

export LC_COLLATE="C"

3) второй вариант конфигурирования локали

# nano /etc/default/locale

LC_COLLATE=C

4) то же, что и 3

# update-locale LC_COLLATE=C

LC_COLLATE=C

Теперь порядок сортировки в системе стал такой (что и требовалось):

1) цифры

2) символы ._! и т.д.

3) латинские буквы

4) кириллица

* Регистр букв не учитывается

 

UPD:

Судя по нижеследующему, установка LC_COLLATE вместо LC_ALL может привести к некоторому неопределенному поведению (но меня, конечно, пронесет!):

To go further, quoting the GNU Coreutils manual (emphasis mine):

If you use a non-POSIX locale (e.g., by setting LC_ALL to en_US), then sort may produce output that is sorted differently than you’re accustomed to.

In that case, set the LC_ALL environment variable to C. Note that setting only LC_COLLATE has two problems. First, it is ineffective if LC_ALL is also set. Second, it has undefined behavior if LC_CTYPE (or LANG, if LC_CTYPE is unset) is set to an incompatible value. For example, you get undefined behavior if LC_CTYPE is ja_JP.PCK but LC_COLLATE is en_US.UTF-8.

0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *