如何自定义字符排序顺序?

如何自定义字符排序顺序?

如何在 Linux 中设置字符的字符顺序/优先级?

我目前正在使用命令来测试这一点,如下所示:

ls -al --group-directories-first

假设我有以下文件:

a
b
c
A
B
C
.a
.b
.c
.A
.B
.C

ls 的默认输出是这样的:

-rw-r--r--  1 username  username     0 Jan 11 07:18 a
-rw-r--r--  1 username  username     0 Jan 11 07:55 .a
-rw-r--r--  1 username  username     0 Jan 11 07:18 A
-rw-r--r--  1 username  username     0 Jan 11 07:55 .A
-rw-r--r--  1 username  username     0 Jan 11 07:18 b
-rw-r--r--  1 username  username     0 Jan 11 07:55 .b
-rw-r--r--  1 username  username     0 Jan 11 07:18 B
-rw-r--r--  1 username  username     0 Jan 11 07:55 .B
-rw-r--r--  1 username  username     0 Jan 11 07:18 c
-rw-r--r--  1 username  username     0 Jan 11 07:55 .c
-rw-r--r--  1 username  username     0 Jan 11 07:18 C
-rw-r--r--  1 username  username     0 Jan 11 07:55 .C

我想要的输出顺序:

-rw-r--r--  1 username  username     0 Jan 11 07:55 .A
-rw-r--r--  1 username  username     0 Jan 11 07:55 .a
-rw-r--r--  1 username  username     0 Jan 11 07:55 .B
-rw-r--r--  1 username  username     0 Jan 11 07:55 .b
-rw-r--r--  1 username  username     0 Jan 11 07:55 .C
-rw-r--r--  1 username  username     0 Jan 11 07:55 .c
-rw-r--r--  1 username  username     0 Jan 11 07:18 A
-rw-r--r--  1 username  username     0 Jan 11 07:18 a
-rw-r--r--  1 username  username     0 Jan 11 07:18 B
-rw-r--r--  1 username  username     0 Jan 11 07:18 b
-rw-r--r--  1 username  username     0 Jan 11 07:18 C
-rw-r--r--  1 username  username     0 Jan 11 07:18 c

我尝试过的事情.bashrc

export LC_ALL="C"               #Did not work
export LC_COLLATE="en_US.UTF-8" #Did not work
export LC_LANG="C"              #Did not work
export LC_COLLATE="C"           #Did not work

那么,我如何制定自己的自定义字符顺序/优先级?

谢谢

答案1

看来该sort命令可以提供一些帮助。

-t, --field-separator=SEP

使用 SEP 代替非空白到空白的转换

-k, --key=POS1[,POS2]

在 POS1(起始点 1)处开始密钥,在 POS2 处结束(默认行尾)

ls -lAr|sort -t . -k2
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:35 a
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:35 b
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:36 c
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:36 d
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:38 A
-rw-r--r-- 1 CRM CCRM 0 Jan 20 10:34 .a
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:36 .A
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:38 .b
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:36 .B
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:36 .C
-rw-r--r-- 1 CRM CCRM 0 Jan 20 09:36 .D

答案2

km_KH 区域设置与您要求的内容排序接近,尽管先小写,后大写。 km_KH 语言环境包含在 Centos 7 的标准安装中。因此,可以合理猜测它可能在其他发行版上可用,也许可以通过存储库中的额外软件包来实现。

您可以将此别名定义放入 .bashrc 中:

 $ alias l='LC_COLLATE=km_KH ls -lA'
 $ touch a b c A B C .a .b .c .A .B .C
 $ l
total 0
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 .a
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 .A
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 .b
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 .B
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 .c
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 .C
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 a
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 A
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 b
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 B
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 c
-rw-rw-r-- 1 g greg 0 2020-11-08 18:01 C

尽管点文件排在最后,ar_SA 语言环境的排序也接近您要求的排序:

-rw-rw-r-- 1 g greg 0 Nov  8 18:33 A
-rw-rw-r-- 1 g greg 0 Nov  8 18:33 a
-rw-rw-r-- 1 g greg 0 Nov  8 18:33 B
-rw-rw-r-- 1 g greg 0 Nov  8 18:33 b
-rw-rw-r-- 1 g greg 0 Nov  8 18:33 C
-rw-rw-r-- 1 g greg 0 Nov  8 18:33 c
-rw-rw-r-- 1 g greg 0 Nov  8 18:33 .A
-rw-rw-r-- 1 g greg 0 Nov  8 18:33 .a
-rw-rw-r-- 1 g greg 0 Nov  8 18:33 .B
-rw-rw-r-- 1 g greg 0 Nov  8 18:33 .b
-rw-rw-r-- 1 g greg 0 Nov  8 18:33 .C
-rw-rw-r-- 1 g greg 0 Nov  8 18:33 .c

这是一个简单的循环,用于查看每个已安装的语言环境如何对当前目录进行排序:

for a in $(locale -a);do echo $a;LC_COLLATE=$a ls -Al;done|&less

或者您可以使用一些实用技巧,例如: 使用自定义模式排序

这里的排序和连接答案很有趣: http://superuser.com/questions/489275/how-to-do-custom-sorting-using-unix-sort

或者您可以硬着头皮定义自己的区域设置,请参阅http://askubuntu.com/questions/653008/how-to-create-a-new-system-locale

相关内容