如何使用 sed 从路径中提取最后两个(或任意数量)目录?

如何使用 sed 从路径中提取最后两个(或任意数量)目录?

我确实在寻找一个通用的解决方案,但为了举例说明,假设我正在寻找最深层的2路径中的目录。例如:给定一个路径/home/someone/foo/bar,如何使用 sed (或 awk) 来获取foo/bar

如果路径的第一部分始终相同,那将会很简单,但就我而言,我正在寻找一种适用于任意路径的表达式,理想情况下,适用于任何深度n

如果路径的级别少于n(在本例中为 2 个),则命令的行为并不重要。

我今天去做了这件事,发现它很棘手。我开始编写一个循环来代替它,但我无法摆脱这种感觉,即这必须用一个命令就可以实现。我可能错了。有什么想法吗?

答案1

echo "/your/directory/here/bla" | awk -F"/" '{ print "/"$(NF-1)"/"$NF }'

应该可以找到,我没有尝试,但是像这样的东西应该可以工作:

find /yourfolder/structure -type d | awk -F"/" '{ print "/"$(NF-1)"/"$NF }'

仅供参考,$NF 是在 awk 中发现的最新字段,$(NF-1) 是前一个字段。

答案2

在 awk 中,将字段分隔符更改为斜线:

$ echo /home/someone/foo/bar | awk -F / -v OFS=/ '{ print $(NF-1), $NF }'
foo/bar

这会将输入字段分隔符和输出字段分隔符都设置为斜线,然后打印倒数第二个字段值、字段分隔符,然后打印最后一个字段值。

n 值解决方案

$ echo /home/someone/foo/bar | awk -F / -v n=3 '
    { o = $NF; for (f=1; f<n; f++) o = $(NF-f) "/" o; print o }
  '
someone/foo/bar

这使用循环来提取所需数量的目录。

相关内容