Это причиняет мне боль:
echo -e "http://z.com\nhttps://a.com" | sort vs. echo -e "http://z.com\nhttps://a.com" | LC_ALL=C sort
Кажется, сортировка игнорирует http vs https при сортировке под UTF-8. Но то, что действительно меня заводит, – это то, что я не могу найти ни одной информации о таком поведении. Может кто-нибудь, пожалуйста, назовите меня?
В локали C
sort
сортировку в порядке, заданном необработанными байтами; в локали en_US
сортируйте sort
в соответствии с культурным лексикографическим порядком:
В локали C
:
http://z
sort перед https://a
потому что ':'
(58) меньше, чем 's'
(115).
В локали en_US
:
https://a
сортирует до http://z
потому что американский лексикографический порядок игнорирует разделители, поэтому строки сопоставляются так, как если бы они были httpsa
и httpz
, и, очевидно, s
встречается до z
.
man 1 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_COLLATE
:
$ echo -e 'ab:d\nabc:d' | LC_COLLATE=en_US.UTF-8 sort abc:d ab:d $ echo -e 'ab:d\nabc:d' | LC_COLLATE=C.UTF-8 sort ab:d abc:d
Примечание: переменная среды LC_ALL
имеет приоритет над подробными переменными LC_
.