使用sed替换双引号和空格

时间:2012-11-01 08:34:40

标签: linux unix

我在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抛出错误。

请帮助我了解我走错路的地方。已经花了好几个小时。

4 个答案:

答案 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的答案是有道理的。确保您的代码完全符合您的要求,并且“无意中”无效。