我有
#!/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
是数字,应替换为与相应反向引用表达式匹配的文本。 [...] 为了 遇到彼此反斜杠('\
'),后面的字符将失去其特殊含义(如果有的话)。