Bash 按非字典顺序对以标点符号开头的行进行排序

Bash 按非字典顺序对以标点符号开头的行进行排序

我有一个文件,其中包含一些行,其中一些以!字符开头,一些以?字符开头,一些以空格 ( ) 开头。第二个字符始终是字母表中的字母。

当我尝试使用sortcoreutils 中的 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”,则会出现未定义的行为。

相关内容