我有一个 linux 命令可以打印以下内容:
folder/subfolder1/file1.txt
folder/subfolder2/file1.txt
folder/subfolder2/file2.txt
folder/subfolder3/sub-subfolder3/file1.txt
我的目标是用来sed
打印以下结果:
folder/subfolder1
folder/subfolder2
folder/subfolder2
folder/subfolder3
但是,我无法仅保留主文件夹和直接子文件夹,我只能删除文件名
's/\(folder\/.*\)\(\/.*\)/\1/'
,打印
folder/subfolder1
folder/subfolder2
folder/subfolder2
folder/subfolder3/sub-subfolder3
答案1
IIUC,您只想打印深度不超过 的路径subfolder
。在这种情况下,您可以使用cut
:
your_command | cut -d/ -f1-2
或者awk
:
your_command | awk -v FS='/' '{print $1 "/" $2}'
答案2
之后.*
的folder\/
比赛贪婪地,只留下最后一个/
在第二个捕获组中匹配。
相反,您可以使用[^/]*
将所有内容匹配到下一个分隔符:
sed 's/\(folder\/[^/]*\)\(\/.*\)/\1/'
或(因为你实际上并没有使用第二组)
sed 's/\(folder\/[^/]*\)\/.*/\1/'
答案3
使用 GNU sed 可以按如下方式完成:
your_command | sed -n 's|/|\n|2g;P'
或者,如果使用 POSIX sed 编辑器来打印所需的数据。将所有斜杠转换为换行符,然后恢复第一个斜杠并打印到第一个换行符。
your,_command |
sed -n '
y/\//\n/
s|\n|/|;P
'