我有一个文件,其中包含一些行,其中一些以!
字符开头,一些以?
字符开头,一些以空格 ( ) 开头。第二个字符始终是字母表中的字母。
当我尝试使用sort
coreutils 中的 bash 命令时,这似乎忽略了第一个字符,而仅根据第二个字符进行排序。
这让我非常惊讶,因为我以为排序会根据标点符号的 ascii 值来处理它们,并将所有的!
行集中在一起,然后将所有的?
行集中在一起,等等。
具体来说,文档中说有一个-d
选项,明确指示sort
命令忽略此类标点符号。但我想要的是相反的行为,并且没有“反转”此行为的选项。就好像这个-d
选项不知何故“嵌入”了一样。
我已经检查过,据我所知,我没有在某处定义可能-d
意外激活标志的别名。
这是 ? (coreutils v8.32) 中的一个错误吗sort
?有没有办法强制它不按字典顺序排序,而是按严格的 ascii 值排序?
操作系统:Linux Mint 21.1(据我所知基于 ubuntu jammy),以防万一
编辑:根据要求提供语言环境和 MVP
$ locale
LANG=en_GB.UTF-8
LANGUAGE=en_GB:en
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC=en_GB.UTF-8
LC_TIME=en_GB.UTF-8
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY=en_GB.UTF-8
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER=en_GB.UTF-8
LC_NAME=en_GB.UTF-8
LC_ADDRESS=en_GB.UTF-8
LC_TELEPHONE=en_GB.UTF-8
LC_MEASUREMENT=en_GB.UTF-8
LC_IDENTIFICATION=en_GB.UTF-8
LC_ALL=
$ echo '
> !a
> ?b
> c
> !f
> e
> ?d' | sort
!a
?b
c
?d
e
!f
答案1
您可能希望按语言C
环境排序。例如,给定
$ printf '%2s\n' '!a' '?b' 'c' '!f' 'e' '?d'
!a
?b
c
!f
e
?d
然后
$ printf '%2s\n' '!a' '?b' 'c' '!f' 'e' '?d' | LC_COLLATE=C sort
c
e
!a
!f
?b
?d
或者更好的是,使用LC_ALL=C
因为根据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”,则会出现未定义的行为。