【发布时间】:2011-06-06 01:20:21
【问题描述】:
如何去除给定路径中不必要的斜线?
例子:
p="/foo//////bar///hello/////world"
我想要:
p="/foo/bar/hello/world"
【问题讨论】:
如何去除给定路径中不必要的斜线?
例子:
p="/foo//////bar///hello/////world"
我想要:
p="/foo/bar/hello/world"
【问题讨论】:
使用纯 Bash:
shopt -s extglob
echo ${p//\/*(\/)/\/}
【讨论】:
使用真实路径:
realpath -sm $p
参数:
-m, --canonicalize-missing no components of the path need exist
-s, --strip, --no-symlinks don't expand symlinks
【讨论】:
您的意见:
p="/foo//////bar///hello/////world"
删除不相关斜线的命令:
echo $p | tr -s /
输出:
/foo/bar/hello/world
【讨论】:
echo $p | sed -r 's|/+|/|g' 或 echo $p | sed 's|//*|/|g'
tr -s / --squeeze-repeats 非常酷的选项,可以将所有重复的字符压缩为一个。感谢最短的解决方案!
/foo/.//bar///hello/./world 这样的东西也可以正常工作。readlink -f,但这也会规范化该路径中的符号链接,因此结果取决于您的文件系统,并且提供的路径必须实际存在,因此这不适用于虚拟路径。【讨论】:
这适用于多个分隔符,并且不假定给定路径应该存在:
p=/foo///.//bar///foo1/bar1//foo2/./bar2;
echo $p | awk '{while(index($1,"/./")) gsub("/./","/"); while(index($1,"//"))
gsub("//","/"); print $1;}'
但不简化包含“..”的井字串
【讨论】:
在 zsh 中:
echo "${p:a}"
也适用于不存在的路径。
【讨论】:
感谢您的回复。我知道这条路工作正常。我只是出于光学原因想要这个。
我找到了另一个解决方案:echo $p | replace '//' ''
【讨论】: