替换管道字符“|”带有转义的 pip 字符“\|”在 bash 脚本中的字符串中

Replace pipe character "|" with escaped pip character "\|" in string in bash script

我正在尝试用其中的转义字符替换字符串中的竖线字符:

输入:"text|jdbc" 输出:"text\|jdbc"

我用 tr 尝试了不同的东西:

echo "text|jdbc" | tr "|" "\|"
...

但其中 none 有效。 任何帮助,将不胜感激。 谢谢,

tr 适用于字符的一对一映射(阅读 "translate")。 \| 是两个字符,您不能为此使用 tr。您可以使用 sed:

echo 'text|jdbc' | sed -e 's/|/\|/'

此示例替换了一个 |。如果要替换多个,添加g标志:

echo 'text|jdbc' | sed -e 's/|/\|/g'

@JuanTomas 的一个有趣提示是使用不同的分隔符以提高可读性,例如:

echo 'text|jdbc' | sed -e 's_|_\|_g'

您可以利用 |bash 中的特殊字符这一事实,这意味着 printf 使用的 %q 修饰符将为您转义:

$ printf '%q\n' "text|jdbc"
text\|jdbc

不需要 | 特殊处理的更通用的解决方案是

$ f="text|jdbc"
$ echo "${f//|/\|}"
text\|jdbc

${f//foo/bar} 扩展 f 并用 bar 替换每个出现的 foo。这里的运算符是/;当后面跟着另一个 / 时,它会替换所有出现的搜索模式,而不仅仅是第一个。例如:

$ f="text|jdbc|two"
$ echo "${f/|/\|}"
text\|jdbc|two
$ echo "${f//|/\|}"
text\|jdbc\|two

你可以试试 awk:

echo "text|jdbc" | awk -F'|' '=' OFS="\\|"