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

我正在尝试将xml配置插入几乎位于文件中间的元素中,因此我正在使用该行来测试sed's//\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命令本身无论如何都需要转义/换行符,因此对于编写更漂亮的代码没有太大帮助。

上面的命令给了我错误消息“unerminated address regex”,我不能真正看到它的基本语法为s/pattern/replace/的原因。如果将s/添加到sed命令的开头,我只会收到一条消息,指出s未正确终止。

我一直在寻找相当长的时间来尝试弄清楚如何管理多行sed脚本,尽管我只是要编写一个sed脚本,但是我除了 shell 程序脚本之外还需要另一个脚本,我不确定我只是为了进行配置更改而已,这似乎有点过大了。

最佳答案

您最好将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>

关于linux - 多行sed表达式不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22040979/

10-10 17:43
查看更多