我在rhel5上并遇到以下问题: 我有一个函数,用我想要的文本替换给定行的所有内容。一切正常,直到我需要双引号放置。以下是代码:
ReplaceLine()
{
txnFile="File.xml"
if [ "$2" == "enable" ];then
replace="<ref bean=\\"$3\\"/>"
else
replace="<!--<ref bean=\\"$3\\"/>-->"
fi
sed -i "$1s/.*/$replace/" $txnFile
}
$1=line number
$2=enable/disable
$3=string to be put
当前代码用以下代码替换文件中的给定行:
<ref bean=beginEventBean/>
我想要的是:
<ref bean="beginEventBean"/>
注意缺少的双引号。另外我在sed中使用双引号,因为没有它们变量中的空格导致sed抛出错误。
请帮助我了解我走错路的地方。已经花了好几个小时。
答案 0 :(得分:1)
如果没有看到源代码行,我无法测试我的解决方案。不过,以下几行肯定没有按照你的想法行事:
replace="<ref bean=\\"$3\\"/>"
^ ^ ^
| | |
start quoted | |
backslash |
end quoted
再添加一个反斜杠,或删除一个反斜杠。
答案 1 :(得分:1)
以下内容应该有效:
replace="<ref bean=\"$3\"\/>"
注意只有一个反斜杠(你转义双引号)和/字符前面的反斜杠(你将它转义为sed以将其用作常规字符,而不是sed替换命令中使用的元字符)
答案 2 :(得分:1)
你忘了逃避关闭标签的正斜线。你放了两个斜线。
# one line solution
# sed -i "$1s/.*/<ref bean=\"$3\"\/>/" $txnFile
# ^ ^ ^
ReplaceLine()
{
txnFile="File.xml"
if [ "$2" == "enable" ];then
replace="<ref bean=\"$3\"\/>"
else
replace="<!--<ref bean=\"$3\"\/>-->"
fi
sed -i "$1s/.*/$replace/" $txnFile
}
答案 3 :(得分:1)
使用sed -i "$1s#.*#\"$replace\"#" $txnFile
。请注意,它使用#
代替/
作为SED的分隔符,因为$replace
包含/
。另外,@ choroba的答案是有道理的。确保您的代码完全符合您的要求,并且“无意中”无效。