我正在尝试在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/