用sedreplace双引号和空格

我在rhel5上,并有以下问题:我有一个函数,用我想要的文本replace给定行中的所有内容。 一切正常,直到我需要双引号放置。 以下是代码:

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 

当前的代码用下面的代码replace文件中给定的行:

 <ref bean=beginEventBean/> 

我想要的是这样的:

 <ref bean="beginEventBean"/> 

注意缺less的双引号。 另外我在sed中使用双引号,因为没有它们,variables中的空格导致sed抛出错误。

请帮我理解我走错了路。 这已经花了几个小时了。

你忘了逃避关闭标签的正斜杠。 你把两个很多的斜杠。

 # 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 } 

没有看到源代码,我无法测试我的解决方案。 不过,下面这行绝对不是你所想的:

 replace="<ref bean=\\"$3\\"/>" ^ ^ ^ | | | start quoted | | backslash | end quoted 

再加一个反斜杠,或删除一个。

像下面的东西应该工作:

 replace="<ref bean=\"$3\"\/>" 

请注意,只有一个反斜杠(您可以使用双引号)和/字符前面的反斜杠(您将其转义为sed将其用作常规字符,而不是用于替换sed命令的元字符)

使用sed -i "$1s#.*#\"$replace\"#" $txnFile 。 请注意,它使用#而不是/作为SED的分隔符,因为$replace包含/ 。 另外,@choroba的答案是有道理的。 确保你的代码正是你想要的,不会“意外”地工作。