使用 sed 从路径中删除最后 2 个目录

使用 sed 从路径中删除最后 2 个目录

如何从路径中删除最后 2 个目录?

路径示例:

./dir1/dir2/file-example.json

我希望它是怎样的:

./dir1/

答案1

如果该路径是可变的,我建议使用专用工具。

例如,在zsh

file=./dir1/dir2///file-example.json
parent=$file:h:h

(头的头)。

或者使用bashGNU 实用程序:

IFS= read -rd '' parent < <(
  dirname -z -- "$file" | xargs -r0 dirname -z --)

这样做sed意味着您必须手动实现算法,如果您想像dirnameorzsh一样很好地处理所有情况:h,那可能会很复杂。需要考虑的事项:

  • 尾随的应该被忽略(但在输入文件是或 的/情况下不是全部)////
  • 两个或多个 s 的其他序列/应被视为与单个序列相同/,除非可能需要在某些系统上进行特殊处理的情况//foo/bar//解释了为什么我添加///到上面的示例中来演示)。
  • 的目录名foo应该是.
  • 的目录名/应该是/
  • 请记住,文件路径可以包含任何非 NUL 字节序列。这包括不形成有效字符或表示换行符的字节序列。该路径可能比 LINE_MAX 长(并且某些sed实现不会处理比这长的行)。

sed只要您使用-z并在C/语言环境中调用它,就应该可以使用 GNU 实现来完成此操作POSIX,但这并非易事。

如果要查找文件的父目录的父目录file-example.json,您可以这样做:

parents=(*/**/file-example.json(ND:h:h))

在 zsh 中。或者使用bash4.4+ 和 GNU 实用程序:

readarray -td '' parents < <(
  find . -mindepth 2 -name file-example.json -print0 |
    LC_ALL=C gawk -F/ -v RS='\0' -v ORS='\0' '
      {NF -= 2; print}'
)

获取$parents数组中的这些目录。

相关内容