Tas*_*nou 3 bash sort coreutils
我有一个包含行的文件,其中一些以!字符开头,一些以字符?开头,一些以空格 ( ) 字符开头。第二个字符始终是字母表中的字母。
当我尝试使用sortcoreutils 中的 bash 命令时,这似乎忽略了第一个字符,并仅根据第二个字符进行排序。
这让我非常惊讶,因为我认为排序会根据标点符号的 ascii 值来处理标点符号,并将所有行集中!在一起,然后将所有?行集中在一起,等等。
特别是,文档说有一个-d选项,它明确指示sort命令忽略此类标点符号。但我想要的是相反的行为,并且没有选择“逆转”这种行为。就好像这个-d选项已经以某种方式“烘焙”出来了。
我已经检查过,据我所知,我没有在某个地方定义了可能会-d意外激活该标志的别名。
这是一个错误吗sort?(coreutils v8.32)。有没有办法强制它不按字典顺序排序,而是按严格的 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=
Run Code Online (Sandbox Code Playgroud)
$ echo '
> !a
> ?b
> c
> !f
> e
> ?d' | sort
!a
?b
c
?d
e
!f
Run Code Online (Sandbox Code Playgroud)
您可能想按C区域设置进行排序。前任。给定
$ printf '%2s\\n' '!a' '?b' 'c' '!f' 'e' '?d'\n!a\n?b\n c\n!f\n e\n?d\nRun Code Online (Sandbox Code Playgroud)\n然后
\n$ printf '%2s\\n' '!a' '?b' 'c' '!f' 'e' '?d' | LC_COLLATE=C sort\n c\n e\n!a\n!f\n?b\n?d\nRun Code Online (Sandbox Code Playgroud)\n或者也许更好,使用LC_ALL=C因为根据info sort前者受到其他变量的影响:
\n\n---------- 脚注 ----------
\n(1) 如果您使用非 POSIX 语言环境(例如,通过将 \xe2\x80\x98LC_ALL\xe2\x80\x99 设置为\n\xe2\x80\x98en_US\xe2\x80\x99),则 \xe2\x80 \x98sort\xe2\x80\x99 可能会产生与\xe2\x80\x99 习惯的排序不同的输出。在这种情况下,请将 \xe2\x80\x98LC_ALL\xe2\x80\x99 环境变量\n设置为 \xe2\x80\x98C\xe2\x80\x99。请注意,仅设置 \xe2\x80\x98LC_COLLATE\xe2\x80\x99 有两个\n问题。首先,如果\xe2\x80\x98LC_ALL\xe2\x80\x99也被设置,则无效。其次,如果 \xe2\x80\x98LC_CTYPE\xe2\x80\x99 (或 \xe2\x80\x98LANG\xe2\x80\x99,如果 \xe2\x80\x98LC_CTYPE\xe2\x80\x99 是\,则具有未定义的行为nunset) 设置为不兼容的值。例如,如果 \xe2\x80\x98LC_CTYPE\xe2\x80\x99 为 \xe2\x80\x98ja_JP.PCK\xe2\x80\x99 但 \xe2\x80\x98LC_COLLATE\xe2\x80\x99 为\n\xe2\x80\x98en_US.UTF-8\xe2\x80\x99。
\n