【问题标题】:How to remove last directory from a path with sed?如何使用 sed 从路径中删除最后一个目录?
【发布时间】:2011-03-11 15:11:51
【问题描述】:

如何使用sed(不是dirname)删除最后一个目录,如下所示:

echo "/dir1/dir2/dir3/dir4" | sed .....

所以我会得到/dir1/dir2/dir3

【问题讨论】:

    标签: shell sed path


    【解决方案1】:

    您不必使用外部工具

    $ a="/dir1/dir2/dir3/dir4"

    $ echo ${a%/*}

    【讨论】:

    • 虽然当前接受的答案肯定是好的,但如果问题与 bash 有关,我相信这应该是接受的答案。 bash 参数替换只是感觉比 sed 更“真实”的 bash。
    • 不过,它不能用于流式输入。
    【解决方案2】:
    sed 's,/*[^/]\+/*$,,'
    

    如果是shell脚本的一部分,那么dirname肯定会更清楚。

    【讨论】:

    • 如果目录有“.”,这不起作用(句号)以其名称
    • @ChrisF 嗯?你为什么这么写? echo a.b/c.d/e.f | sed 's,/*[^/]\+/*$,,' 返回 a.b/c.d 或者它不在您的 sed 版本中?我的正则表达式与. 一点关系都没有。
    • 目录名与“.”有问题在目录名称中,正则表达式工作正常。
    【解决方案3】:

    你可以使用 "dirname" shell 命令:

    dirname /dir2/dir3/dir4
    

    【讨论】:

      【解决方案4】:
      echo "/etc1/etc2/etc3/etc" | sed -e "s/\/[^\/]*$//"
      

      生产

      /etc1/etc2/etc3
      

      基本上在最后一个斜线之后去掉不包含另一个斜线的任何内容。

      【讨论】:

      • 糟糕,使用逗号作为分隔符(如 przemoc 所示)会更好地避免在脚本中转义斜杠,使其更具可读性。我总是犯这个错误。
      猜你喜欢
      • 1970-01-01
      • 2019-10-03
      • 2021-01-30
      • 1970-01-01
      • 2014-12-11
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多