折叠重复字符

折叠重复字符

echo "$PWD//" | sed -e 's#//\+#/#g'有没有比用单个斜杠替换重复斜杠更 Bashist 的方法呢?

谢谢史蒂文·D,现在有一个完全可以工作的函数来查找两条或多条路径的最长公共路径公共路径

答案1

不是“仅限 Bash”的答案,但也许有用:

echo "$PWD///" | tr -s '/'

答案2

可以在“pure bash”中使用,但仅限于extglobactive。

$ shopt -s extglob
$ A="////qsd/////sdfgfg//qsd//////"
$ echo ${A//\/+(\/)/\/}
/qsd/sdfgfg/qsd/

答案3

仅 Bash,通过使用变量:

# code:
shopt -s extglob
A="$PWD//"; 
echo "Original: $A"; 
echo "Result:   ${A//+(\/)//}"

# output:
Original: /home/myhome/Projects/Bob/build//
Result:   /home/myhome/Projects/Bob/build/
  • // = 搜索和替换,继续搜索和替换

  • +(/) = 匹配一个或多个“/”

  • // = 替换为“/”

为了更好的视觉示例,我们假设“z”需要被挤压才能更好地看到这一点,而无需转义斜杠,并且不要让我们的搜索/替换与 ${VAR//pattern/string} 的基础结构混淆:

# code:
shopt -s extglob
A=zzz/zzz/zzzzz/zzzz/zzzz; 
echo $A; 
echo ${A//+(z)/z}

# output:
zzz/zzz/zzzzz/zzzz/zzzz
z/z/z/z/z

答案4

更新:(+1)有正确的想法......我的答案仅适用于奇数个“/”

确实如此不是需要设置“extglob”。

var="$PWD///"; var="${var//\/\//}" ;回显“$var”

相关内容