我正在尝试对补丁进行排序以突出显示特定的更改:
$ 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