【问题标题】:Remove unnecessary slashes from a given path with bash使用 bash 从给定路径中删除不必要的斜杠
【发布时间】:2011-06-06 01:20:21
【问题描述】:

如何去除给定路径中不必要的斜线?

例子:

p="/foo//////bar///hello/////world"

我想要:

p="/foo/bar/hello/world"

【问题讨论】:

    标签: bash path


    【解决方案1】:

    使用readlink:

    p=$(readlink -m "/foo//////bar///hello/////world")
    

    请注意,这将规范化符号链接。如果这不是您想要的,请使用sed

    p=$(echo "/foo//////bar///hello/////world" | sed s#//*#/#g)
    

    【讨论】:

    • 可以改用readlink -m,目录不需要存在。
    • @Ryan Li 谢谢,确实好多了。已更新。
    • 谢谢。我已经尝试过sed 's/\/\//\//g',它没有按我想要的方式工作。
    【解决方案2】:

    使用纯 Bash:

    shopt -s extglob
    echo ${p//\/*(\/)/\/}
    

    【讨论】:

      【解决方案3】:

      使用真实路径:

      realpath -sm $p

      参数:

        -m, --canonicalize-missing   no components of the path need exist
        -s, --strip, --no-symlinks   don't expand symlinks
      

      【讨论】:

        【解决方案4】:

        您的意见:

        p="/foo//////bar///hello/////world"
        

        删除不相关斜线的命令:

        echo $p | tr -s /
        

        输出:

        /foo/bar/hello/world
        

        【讨论】:

        • 这绝对是我最喜欢的问题解决方案。此处仅供参考,另外还有 2 个使用 sed:echo $p | sed -r 's|/+|/|g'echo $p | sed 's|//*|/|g'
        • tr -s / --squeeze-repeats 非常酷的选项,可以将所有重复的字符压缩为一个。感谢最短的解决方案!
        【解决方案5】:
        1. 考虑是否需要这样做。在 Unix 上,指定重复的路径分隔符(甚至像 /foo/.//bar///hello/./world 这样的东西也可以正常工作。
        2. 您可以使用readlink -f,但这也会规范化该路径中的符号链接,因此结果取决于您的文件系统,并且提供的路径必须实际存在,因此这不适用于虚拟路径。

        【讨论】:

        • 大多数情况下,额外的斜杠可以正常工作,但在某些情况下它们会导致问题(如果路径有双斜杠,我曾经使用 rsync 选项无法正常工作)
        【解决方案6】:

        这适用于多个分隔符,并且不假定给定路径应该存在:

        p=/foo///.//bar///foo1/bar1//foo2/./bar2; 
        echo $p | awk '{while(index($1,"/./")) gsub("/./","/"); while(index($1,"//"))
             gsub("//","/");  print $1;}'
        

        但不简化包含“..”的井字串

        【讨论】:

          【解决方案7】:

          在 zsh 中:

          echo "${p:a}"
          

          也适用于不存在的路径。

          【讨论】:

            【解决方案8】:

            感谢您的回复。我知道这条路工作正常。我只是出于光学原因想要这个。

            我找到了另一个解决方案:echo $p | replace '//' ''

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-10-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-16
              • 2014-08-22
              • 2018-08-15
              • 1970-01-01
              相关资源
              最近更新 更多