这让我心痛:
echo -e "http://z.com\nhttps://a.com" | sort
vs.
echo -e "http://z.com\nhttps://a.com" | LC_ALL=C sort
Run Code Online (Sandbox Code Playgroud)
在 UTF-8 下排序时,排序似乎忽略了 http 与 https。但真正让我生气的是我找不到关于这种行为的任何文件。有人可以指点我吗?
在C语言环境下,sort按照原始字节给出的顺序进行排序;在en_USlocale 中,sort按文化上适当的字典顺序排序:
在C语言环境中:
http://z排序之前,https://a因为':'(58) 小于's'(115)。
在en_US语言环境中:
https://a排序之前,http://z因为美式英语词典顺序忽略了分隔符,因此字符串被整理成好像它们是httpsaand 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.
Run Code Online (Sandbox Code Playgroud)
要仅更改排序顺序,您可以设置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
Run Code Online (Sandbox Code Playgroud)
注意:环境变量LC_ALL优先于详细LC_变量。