很长一段时间,我认为程序的默认行为sort
是使用 ASCII 顺序。但是,当我在sort
不带任何参数的情况下输入以下行时:
#
@
Run Code Online (Sandbox Code Playgroud)
我有:
@
#
Run Code Online (Sandbox Code Playgroud)
但是根据ASCII表,#
是35,@
是64。 另一个例子是:
A
a
Run Code Online (Sandbox Code Playgroud)
输出是:
a
A
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?顺便说一下,使用时什么是“字典顺序” sort -d
?
小智 24
看起来您使用的是非 POSIX 语言环境。
尝试:
export LC_ALL=C
Run Code Online (Sandbox Code Playgroud)
然后sort
。
info sort
明确地说:
(1) 如果您使用非 POSIX 语言环境(例如,通过将 `LC_ALL' 设置为 `en_US'),那么 `sort' 可能会产生与您习惯的排序不同的输出。在这种情况下,将“LC_ALL”环境变量设置为“C”。请注意,仅设置“LC_COLLATE”有两个问题。首先,如果还设置了“LC_ALL”,则无效。其次,如果`LC_CTYPE'(或`LANG',如果`LC_CTYPE' 未设置)设置为不兼容的值,则它具有未定义的行为。例如,如果`LC_CTYPE' 是`ja_JP.PCK' 而`LC_COLLATE' 是`en_US.UTF-8',你会得到未定义的行为。
如上所述man sort
,\xe2\x80\x9c字典顺序\xe2\x80\x9d表示\n\xe2\x80\x9c仅考虑空格和字母数字字符\xe2\x80\x9d。\xc2\xa0\n例如,给定数据
The\n!quick\nbrown\n@fox\njumps\n#over\n17\n$lazy\n dogs\n%42\ntimes.\n
Run Code Online (Sandbox Code Playgroud)\n\n朴素的sort
命令产生
dogs\n!quick\n#over\n$lazy\n%42\n@fox\n17\nbrown\njumps\nThe\ntimes.\n
Run Code Online (Sandbox Code Playgroud)\n\n(将以空格字符开头的行以及!
、#
、$
、%
和@
符号1 \n 放在以字母和数字开头的行的前面;\ni.e,字母数字字符),但sort -d
会产生
dogs\n17\n%42\nbrown\n@fox\njumps\n$lazy\n#over\n!quick\nThe\ntimes.\n
Run Code Online (Sandbox Code Playgroud)\n\n\xc2\xa0 dogs
仍然是第一个,因为它以空格开头,\n但特殊(标点符号)字符被忽略。\xc2\xa0\n17
出现在 之前42
,并且fox
位于brown
和之间jumps
,\尽管事实上42
和fox
前面有字符\ nthat 通常会将它们移到17
.
\n____________
\n 1按其 ASCII 值的顺序:\nspace=040、!
=041、#
=043、$
=044、%
=045 和@
=0100。\xe2\x80\x82\n请注意(忽略空格键)\n这个在某些键盘上大约是从左到右的顺序。