使用bash从给定路径中删除不必要的斜杠

时间:2011-01-09 11:56:21

标签: bash path

如何在给定路径中删除不必要的斜杠?

示例:

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

我想:

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

8 个答案:

答案 0 :(得分:23)

使用readlink

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

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

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

答案 1 :(得分:8)

使用纯Bash:

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

答案 2 :(得分:5)

使用realpath:

realpath -sm $p

参数:

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

答案 3 :(得分:2)

您的意见:

var sh = client.CreateShellStream("", 0, 0, 0, 0);
sh.WriteLine("my command");
sh.WriteLine("sudo password");

命令删除不相关的斜杠:

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

输出:

echo $p | tr -s /

答案 4 :(得分:0)

  1. 考虑是否需要这样做。在Unix上,指定重复的路径分隔符(甚至像/foo/.//bar///hello/./world之类的东西也可以正常工作。
  2. 您可以使用readlink -f,但这也会规范化该路径中的符号链接,因此结果取决于您的文件系统,并且提供的路径必须实际存在,因此这对虚拟路径无效。

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

在zsh中:

echo "${p:a}"

也可以使用不存在的路径。

答案 7 :(得分:-4)

感谢您的回复。我知道这条路很好。我只是出于光学原因而想要这个。

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