多行sed表达式不起作用

时间:2014-02-26 12:11:52

标签: linux bash shell sed

我正在尝试使用bash shell脚本中的sed在配置文件中的特定xml元素中插入特定的xml配置。当在一行上使用sed命令时它可以工作,但是当表达式在多行上时,它不会。

我正在尝试将xml配置插入到几乎位于文件中间的元素中,所以我使用该行来测试sed的// \ nconfig / gi'file.xml,这样可行,但是我需要添加更多配置,因此生成的sed命令是这样的:

sed -i '
/broker/broker\n \
    <plugins> \
        <jaasAuthenticationPlugin configuration="activemq" /> \
        <authorizationPlugin> \
            <map> \
                <authorizationMap> \
                    <authorizationEntries> \
                        <authorizationEntry topic=> read="admins" write="admins" admin="admins" /> \
                        <authorizationEntry queue=> read="admins" write="admins" admin="admins" /> \
                    </authorizationEntries> \
                </authorizationMap> \
            </map> \
        </authorizationPlugin>
    </plugins>/' $ACTIVEMQ_CONFIG

我最初在bash中将其写为here文档,但事实证明sed命令本身需要转义/行继续符,所以它对于拥有更漂亮的代码没有多大帮助。

上面的命令给我错误消息“未终止的地址正则表达式”,我无法真正看到原因,因为它基本上是sed的's / pattern / replace /'这是语法。如果我将s /添加到sed命令的开头,我只会收到一条消息,说明s没有正确终止。

我一直在寻找相当一段时间来试图想出如何管理多行seds脚本和我虽然我只是要编写一个sed脚本但我还需要另一个脚本以及shell脚本和im我不确定我是否只想进行配置更改,这似乎有点矫枉过正。

2 个答案:

答案 0 :(得分:4)

您最好将XML片段存储在临时文件中,然后使用r命令使用这个简单的sed:

sed -i.bak '/broker/r _temp' file.xml

_temp是这样的:

cat _temp
<plugins>
    <jaasAuthenticationPlugin configuration="activemq" />
    <authorizationPlugin>
        <map>
            <authorizationMap>
                <authorizationEntries>
                  <authorizationEntry topic=> read="admins" write="admins" admin="admins" />
                  <authorizationEntry queue=> read="admins" write="admins" admin="admins" />
                </authorizationEntries>
            </authorizationMap>
        </map>
    </authorizationPlugin>
</plugins>

答案 1 :(得分:2)

正如评论中提到的那样,作为分界线的正斜线正在走硬路。但是,一般来说,你需要用s作为前缀(你在问题中这样说,但在正则表达式中省略它),否则sed会认为b是一个分支命令,你会得到地址错误。此外,您需要为每个</添加反斜杠前缀,并且还可以避开引号。

这是你的正则表达式,

sed -i 's/broker/broker\n \
<plugins> \
    <jaasAuthenticationPlugin configuration=\"activemq\" \/> \
    <authorizationPlugin> \
        <map> \
            <authorizationMap> \
                <authorizationEntries> \
                    <authorizationEntry topic=> read="admins" write="admins" admin="admins" \/> \
                    <authorizationEntry queue=> read="admins" write="admins" admin="admins" \/> \
                <\/authorizationEntries> \
            <\/authorizationMap> \
        <\/map> \
    <\/authorizationPlugin> \
<\/plugins>/'

<强> See it live