我有这样的输出(字母数字):
bash /etc/file
bash /etc/filenew
bash /etc/skel/
bash /etc/skel/file
bash /etc/skel/filenew
bash /etc/skel/new/backups/
bash /etc/skel/new/file
bash /etc/skel/old/backups/
bash /etc/skel/old/file
bash /usr/
bash /usr/bin/
bash /usr/bin/file
bash /usr/sbin/
bash /usr/sbin/file.sbin
我需要对输出本身进行排序以首先显示目录,如下所示:
bash /etc/skel/
bash /etc/skel/new/backups/
bash /etc/skel/new/file
bash /etc/skel/old/backups/
bash /etc/skel/old/file
bash /etc/skel/file
bash /etc/skel/filenew
bash /etc/file
bash /etc/filenew
bash /usr/
bash /usr/bin/
bash /usr/bin/file
bash /usr/sbin/
bash /usr/sbin/file.sbin
答案1
我认为以下命令很接近:
sed -r 's:([^/]*/):d\1:g; s:([^/]+)$:f\1:' foo.txt |
sort |
sed -r 's:/f:/:; s:d([^/]*/):\1:g'
它有什么作用?第一个sed
命令在每个目录的开头添加一个d
(通过查找以 结尾的字符串/
),并f
在文件(不以 结尾的文件)中添加一个/
。然后我们应用sort
- 由于d
在 之前排序f
,因此目录首先排序。第二个命令sed
撤消第一个命令。
对于示例输入:
$ sed -r 's:([^/]*/):d\1:g; s:([^/]+)$:f\1:' foo.txt |
sort |
sed -r 's:/f:/:; s:d([^/]*/):\1:g'
bash /etc/skel/
bash /etc/skel/new/backups/
bash /etc/skel/new/file
bash /etc/skel/old/backups/
bash /etc/skel/old/file
bash /etc/skel/file
bash /etc/skel/filenew
bash /etc/file
bash /etc/filenew
bash /usr/
bash /usr/bin/
bash /usr/bin/file
bash /usr/sbin/
bash /usr/sbin/file.sbin