这让我心痛:
echo -e "http://z.com\nhttps://a.com" | sort
vs.
echo -e "http://z.com\nhttps://a.com" | LC_ALL=C sort
在 UTF-8 下排序时,排序似乎忽略了 http 与 https。但真正让我抓狂的是我找不到关于这种行为的任何文档。有人可以指点我吗?
答案1
在C
语言环境下,sort
按原始字节给出的顺序排序;在语言en_US
环境中,sort
按文化上适当的词典顺序排序:
在
C
语言环境中:http://z
排序在前,https://a
因为':'
(58) 小于's'
(115)。在
en_US
语言环境中:https://a
排序在前面,http://z
因为美式英语词典顺序忽略分隔符,因此字符串会按照httpsa
和进行排序httpz
,并且显然s
位于 之前z
。
*** 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_
变量。