3

我在 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

4 回答 4

1

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

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

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

于 2012-11-01T08:56:09.937 回答
1

像下面这样的东西应该可以工作:

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

注意只有一个反斜杠(你转义双引号)和 / 字符之前的反斜杠(你转义它以便 sed 将其用作常规字符,而不是 sed 的替换命令中使用的元字符)

于 2012-11-01T09:00:25.477 回答
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 
}
于 2012-11-01T09:13:35.547 回答
1

使用sed -i "$1s#.*#\"$replace\"#" $txnFile. 请注意,它使用#而不是/作为 SED 的分隔符,因为$replace包含/. 此外,@choroba 的回答是有道理的。确保您的代码完全符合您的要求,并且不会“意外”运行。

于 2012-11-01T09:14:07.250 回答