根据正则表达式匹配开始使用“ sort”

问题描述

我想对类似于以下内容的输出进行排序:

[drwxrwxrwx user   group      64]  /Volumes/Sample\ Disk/
[-rwxr-xr-x user   group    8.0K]  /Volumes/Sample\ Disk/file.txt
[drwxr-xr-x user   group     256]  /Users/user/Documents/
[---xrwxrwx resu   alpha    2.4K]  /amber/lights.bin
[-------rwx user   group    5926033185992]  /var/fix\ your\ permissions\ haha

通常,我会使用sort,但是我想以特定方式对文本进行排序。我不想在开头使用[,而是希望根据第一个/字符对行进行排序,然后再进一步对行进行排序。

我想要实现的结果应如下所示:

[drwxr-xr-x user   group     256]  /Users/user/Documents/
[drwxrwxrwx user   group      64]  /Volumes/Sample\ Disk/
[-rwxr-xr-x user   group    8.0K]  /Volumes/Sample\ Disk/file.txt
[---xrwxrwx resu   alpha    2.4K]  /amber/lights.bin
[-------rwx user   group    5926033185992]  /var/fix\ your\ permissions\ haha

如您所见,这些行是按以下方式排序的:符号首先,然后是A-Z,最后是a-z,而忽略开头的[...] 部分。换句话说,我想对这些行进行排序,就好像[...] 不在那儿一样。

我在想一些正则表达式的魔术可以帮助实现这一点,例如^\[.[rwx-]\{9\}.*\]

如您所料,只需通过sort运行输出即可达到以下目的:

[-------rwx user   group    5926033185992]  /var/fix\ your\ permissions\ haha
[---xrwxrwx resu   alpha    2.4K]  /amber/lights.bin
[-rwxr-xr-x user   group    8.0K]  /Volumes/Sample\ Disk/file.txt
[drwxr-xr-x user   group     256]  /Users/user/Documents/
[drwxrwxrwx user   group      64]  /Volumes/Sample\ Disk/

这是我不想要的。

我正在以任何方式实现的目标吗?谢谢。

注意:即使5926033185992不太可能出现在我的输出中,我还是添加了它以显示行并不总是以相同的字符长度开头。

解决方法

您不需要按匹配字段进行排序,而是按固定字段进行排序,它始终是第5列。问题是您要区分大小写,首先要大写,而sort使用LC_COLLATE,它可能是en_US.utf8或类似的字符(您可以在locale中看到)。您必须将其更改为使用ASCII顺序。

LC_COLLATE=C sort -k5 file

输出:

[drwxr-xr-x user   group     256]  /Users/user/Documents/
[drwxrwxrwx user   group      64]  /Volumes/Sample\ Disk/
[-rwxr-xr-x user   group    8.0K]  /Volumes/Sample\ Disk/file.txt
[---xrwxrwx user   alpha    2.4K]  /amber/lights.bin
[-------rwx user   group    5926033185992]  /var/fix\ your\ permissions\ haha

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...