我正试图在bash shell脚本中使用sed在配置文件中的特定xml元素中插入特定的xml配置。当在一行上使用sed命令时,它有效,但当表达式在多行上时,它无效。
我试图在几乎位于文件中间的元素中插入xml配置,因此我使用该行测试sed的s//\nconfig/gi'file.xml,这很有效,但我需要添加更多的配置,因此生成的sed命令如下:
sed -i '
/broker/brokern
<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命令本身无论如何都需要转义/换行符,所以它对拥有更漂亮的代码没有多大帮助。
上面的命令给了我错误消息"unterminated address regex",我真的看不出原因,因为它基本上是sed的/spattern/replace/',这是语法。如果我在sed命令的开头添加s/,我只会收到一条消息,说s没有正确终止。
我已经搜索了很长一段时间,试图弄清楚如何管理多行seds脚本,我以为我只是要写一个sed脚本,但除了shell脚本之外,我还需要另一个脚本,我不确定我是否只想更改配置,这似乎有点过头了。
您应该更好地将XML片段存储在临时文件中,然后将这个简单的sed与r
命令一起使用:
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>
正如评论中所提到的,作为分隔符的正斜杠正在走艰难的道路。然而,通常情况下,您需要用s
作为前缀(您在问题中这样说,但在正则表达式中省略了它),否则sed会认为b
是一个分支命令,并且您会得到地址错误。此外,您还需要在每个<
和/
前面加上反斜杠,并且转义引号也很好。
这是你的正则表达式,
sed -i 's/broker/brokern
<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>/'
现场观看