从变量中转义特殊字符

从变量中转义特殊字符

我有

#!/usr/bin/bash
search="ldo_vrf18 {"
replace="$search"'                      compatible = "regulator-fixed";
                        regulator-name = "vrf18";
                        regulator-min-microvolt = <1800000>;
                        regulator-max-microvolt = <1800000>;
                        regulator-enable-ramp-delay = <120>;'
sed -i "s/$search/$replace/g" output.file

结果是

sed: -e expression #1, char 62: unterminated `s' command

我怀疑某些值没有在replace.有办法逃脱他们吗?我尝试过sed -i 's/'"$search"'/'"$replace"'/g' output.file,结果相同

答案1

问题在于$replace变量中的换行符,这些换行符被解释为sed命令结束。

为了在 GNU 中解决这个问题sed,您需要$replace用文字替换变量中的新行\n

replace=${replace//$'\n'/\\n}

笔记:上面的解决方案并不适用于所有sed实现,因为它是某些版本中的扩展功能(例如,在 GNU 中sed)。根据POSIX 标准:

每个嵌入式<换行>文本中前面应有反斜杠。文本中的其他反斜杠应被删除+,并且后面的字符应按字面意思处理。

因此,在 POSIX 上sed,文字\n将失去换行符的含义,并被视为文字n字符。对于适用于所有实现的可移植解决方案sed,请在实际换行符前面加上反斜杠:

replace=${replace//$'\n'/\\$'\n'}

+除了反斜杠后跟数字:

字符"\n",其中n是数字,应替换为与相应反向引用表达式匹配的文本。 [...] 为了 遇到彼此反斜杠(' \'),后面的字符将失去其特殊含义(如果有的话)。

相关内容