我希望 bash sort 能够像这样比较字符串:
- 从第一个字符开始(两个字符串)
- 如果字符相等,则继续下一个字符
- 如果不相等,则返回大于/小于的结果给排序算法
- 如果没有更多字符,则返回等于
出于某种原因,这似乎不是事实。
让我们接受以下输入:
a
b
.
-
这是由 bash sort 排序的
-
.
a
b
现在,输入
b.de
bb.de
我期望排序结果如下:
b.de
bb.de
因为第一个字符是相等的,并且对于第二个字符来说,.
它在前面b
(如在第一个测试中所见)。
由于某种原因,情况并非如此,字符串的排序如下:
bb.de
b.de
为什么会sort
出现这样的行为?有没有办法让它表现得“如预期”?
我已经使用 python 测试了同样的例子,python 的排序与预期一致。
默认情况下,排序会进行区域感知排序,即使用您所在地区的词典编纂规则。请参阅 strcoll(3)
ltrace(3) 给了我这个:
strcoll("b.de", "bb.de") = 20
定位感知比较似乎将字符串拆分成单词并对其进行排序。由于单词从不以“.”开头,因此 sort 会看到长度为 0 的单词并将其放在列表的开头。但是“.”在单词中是被允许的,例如:“Jr.”“Ph.D”
如果您需要按字节比较,请导出 LC_COLLATE=C 或 LC_COLLATE=POSIX
我检查了该
coreutils
包,如果你不提供任何参数,它看起来(最终)使用 Cstrcmp
例程。唯一不正确的情况是行中的值可以解释为整数。其手册页指出:
这意味着和
strcmp
确实已经到达最后一个字符。bb.de
b.de
也就是说
if 'd' < 'e'
(至少以 ascii 表示)哪个if 100 < 101
是正确的。