多行sed表达式不起作用



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

现场观看

相关内容

  • 没有找到相关文章

最新更新