使用基于正则表达式匹配开头的“排序”

Using `sort` based on a regex-matching beginning

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

[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