什么是排序实用程序的字母顺序?

时间:2015-12-23 21:07:24

标签: bash sorting posix locale collation

我称自己为POSIX shell向导。但是今天我穿上了裤子。

所以这并不奇怪:

bash# printf 'v10\nv1.' | sort
v1.
v10

因为.代码0x2e0代码0x30。但是这个怎么样:

bash# printf 'v101\nv1.1' | sort
v101
v1.1

WTF?好的,我是巫师:

$ locale

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_DK.utf8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

所以:

bash# printf 'v101\nv1.1' | LC_ALL=C sort
v1.1
v101

locales / collat​​ion如何使"v101" < "v1.1"

我认为en_US.UTF-8区域设置具有排序.符号的排序规则。这个测试显示我有点:

bash# printf 'v102\nv1.01' | LC_ALL=en_US.UTF-8 sort
v1.01
v102

bash# printf 'v102\nv1.03' | LC_ALL=en_US.UTF-8 sort
v102
v1.03

我是对的吗?如果我是对的,谁不喜欢点? UTF-8或讲英语的人还是美国人?

这是否与POSIX兼容?

1 个答案:

答案 0 :(得分:2)

是的,当LOCALE不是C时,忽略点。同样忽略破折号。并且排序遵循语言环境。每天学习新东西。

matt@xen:~/dev/OTOY2$ printf "aa\nab\nac\n" | LC_COLLATE=C sort
aa
ab
ac
matth@xen:~/dev/OTOY2$ printf "aa\n.ab\nac\n" | LC_COLLATE=C sort
.ab
aa
ac

matt@xen:~/dev/OTOY2$ printf "aa\nab\nac\n" | sort
aa
ab
ac
matth@xen:~/dev/OTOY2$ printf "aa\n.ab\nac\n" | sort
aa
.ab
ac

您可能有兴趣知道排序也可以进行自然或数字排序。 因此,在排序上使用-g或-h可以正确地对100 10和20进行排序。

在Linux下还有一个--debug标志。

matthewh@xen:~/dev/OTOY2$ printf 'v101\nv1.1' | sort --debug
sort: using ‘en_NZ.UTF-8’ sorting rules
v101
____
v1.1
____

我认为整个答案都嵌入在这个庞大的规范中: http://www.unicode.org/reports/tr10/