使用sed命令匹配父文件夹和直接子文件夹

使用sed命令匹配父文件夹和直接子文件夹

我有一个 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
' 

相关内容