unix 排序将 '-'(破折号)字符视为不可见

unix 排序将 '-'(破折号)字符视为不可见

包含行 (aa ac ab) 的文件 unix 排序为 (aa ab ac) 而不是预期的 (ab aa ac)

就好像 sort 忽略了‘-’字符。

有趣的是,破折号本身排序正确(abc -)排序为(- abc)。

为什么?有什么办法可以改变这种行为吗?

答案1

排序行为排序(1)由您的语言环境设置控制(请参阅man locale)。

有许多不同的区域设置,例如:

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
...
LC_ALL=

要选择所需的排序行为,您需要选择正确的 LC_COLLATE 值。在这种情况下,内置的标准 C(POSIX)语言环境是合适的:

$ sort testcase
aa
a-b
ac

$ LC_COLLATE=C sort testcase
a-b
aa
ac

export LC_ALL=C如果您愿意,您可以通过设置 LC_ALL=C 来设置所有区域设置(从而更加一致)。由于这些是环境变量,您可以在 shell 启动脚本中永久设置排序顺序(或类似)。

答案2

设置环境变量 LC_ALL=C 会改变排序行为。默认语言环境排序顺序必须特别处理“-”。

相关内容