使用基于正则表达式匹配开头的“排序”
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
我想对类似于以下内容的输出进行排序:
[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