为什么这种排序会忽略 +/- 字符前缀?

为什么这种排序会忽略 +/- 字符前缀?

我正在尝试对补丁进行排序以突出显示特定的更改:

$ curl -s https://lists.fedorahosted.org/archives/list/[email protected]/message/ZN6VMFN65JWV7NMG2XEHPUI2AGSLRNGW/attachment/2/0001-LDAP-Change-the-default-rfc2307-autofs-attribute-map.patch | \
grep '^[+-] *{ "' | sort

输出是:

-    { "ldap_autofs_entry_object_class", "automount", SYSDB_AUTOFS_ENTRY_OC, NULL },
+    { "ldap_autofs_entry_object_class", "nisObject", SYSDB_AUTOFS_ENTRY_OC, NULL },
-    { "ldap_autofs_entry_value", "automountInformation", SYSDB_AUTOFS_ENTRY_VALUE, NULL },
+    { "ldap_autofs_entry_value", "nisMapEntry", SYSDB_AUTOFS_ENTRY_VALUE, NULL },
+    { "ldap_autofs_map_name", "nisMapName", SYSDB_AUTOFS_MAP_NAME, NULL },
-    { "ldap_autofs_map_name", "ou", SYSDB_AUTOFS_MAP_NAME, NULL },
-    { "ldap_autofs_map_object_class", "automountMap", SYSDB_AUTOFS_MAP_OC, NULL },
+    { "ldap_autofs_map_object_class", "nisMap", SYSDB_AUTOFS_MAP_OC, NULL },

我本来希望排序按第一个字符 +/- 排序。

我可以确认字符一致为 0x2b 和 0x2d:

$ curl -s https://lists.fedorahosted.org/archives/list/[email protected]/message/ZN6VMFN65JWV7NMG2XEHPUI2AGSLRNGW/attachment/2/0001-LDAP-Change-the-default-rfc2307-autofs-attribute-map.patch | grep '^[+-] *{ "' | cut -c1 | hexdump -C

00000000  2d 0a 2d 0a 2b 0a 2b 0a  2d 0a 2b 0a 2d 0a 2b 0a  |-.-.+.+.-.+.-.+.|
00000010

sort -d给出相同的结果。 -d表示字母数字,而 +/- 不是字母数字。 sort -n也不起作用(我不希望它起作用。)

我使用 Linux/Unix 的时间比我愿意承认的要长,但我以前从未注意到这一点!

……这是预料之中的吗?还有另一种使用方法吗sort? (我知道它也可以在 Perl oneliner 中完成......)

答案1

正如中提到的为什么 ls 排序会忽略非字母数字字符?,默认排序规则为 UTF8,并且 UTF8 认为 +/- 等效。

通过设置LC_COLLATE=C排序,可以获得ascii排序顺序:

curl -s https://lists.fedorahosted.org/archives/list/[email protected]/message/ZN6VMFN65JWV7NMG2XEHPUI2AGSLRNGW/attachment/2/0001-LDAP-Change-the-default-rfc2307-autofs-attribute-map.patch | \
grep '^[+-] *{ "' | LC_COLLATE=C sort

相关内容