如何解决根据正则表达式匹配开始使用“ 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。