如何在给定路径中删除不必要的斜杠?
示例:
p="/foo//////bar///hello/////world"
我想:
p="/foo/bar/hello/world"
答案 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)
/foo/.//bar///hello/./world
之类的东西也可以正常工作。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 '//' ''