我正在尝试使用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我不确定我是否只想进行配置更改,这似乎有点矫枉过正。
答案 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 强>