【问题标题】:Remove "set of xml tag" using sed使用 sed 删除“一组 xml 标记”
【发布时间】:2016-09-23 20:16:29
【问题描述】:

我有巨大的 xml 文件。我想匹配特定的字符串并删除整个相关的标签示例 xml

<server>
    <servlet-name>default</servlet-name>
    <servlet-class>servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</server>

在这个 xml 中,我想匹配 3 个东西 &lt;server&gt;..&lt;servlet-name&gt;default&lt;/servlet-name&gt;....&lt;/server&gt;。如果它匹配 3 件事删除整个事情。我在下面尝试了 sed 命令。

sed -i '/server/,/server/ d' web1.xml

所以在这件事上,整个事情都将被删除。但我也想匹配第三件事 default 就像下面的命令

sed -i '/server/,/webnav/,/server/ d' web1.xml

这个命令不起作用,但我想喜欢这个

【问题讨论】:

  • 使用xml 感知工具而不是sed
  • @Inian 这是什么 xml 工具。我不知道这一点。
  • 这是用于自动化目的以运行所有服务器,因此我无法安装此工具。其他方式

标签: xml sed


【解决方案1】:

正如您在 cmets 中提到的,sed 不是解析 xml 的正确工具。

话虽如此,如果你别无选择,你可以试试这个(风险自负):

sed '/<server>/{:a;/<\/server>/!{N;ba;}};/<servlet-name>default<\/servlet-name>/d;' web1.xml

&lt;server&gt;&lt;/server&gt; 之间的行被合并,如果找到字符串 &lt;servlet-name&gt;default&lt;/servlet-name&gt;,则删除。

说明:

  • /&lt;server&gt;/:如果找到&lt;server&gt;
  • :a: 标签a for 循环来了
  • /&lt;\/server&gt;/!:如果找不到&lt;/server&gt;
  • N:将下一行追加到模式空间
  • ba:循环到:a标签
  • /&lt;servlet-name&gt;default&lt;\/servlet-name&gt;/:循环结束时,在模式空间中搜索字符串&lt;servlet-name&gt;default&lt;/servlet-name&gt;。如果找到:
  • d:清理模式空间(即删除从&lt;server&gt;&lt;/server&gt;的所有内容

【讨论】:

  • 感谢您的代码,此代码运行良好。我是 sed 的新手,你能解释一下这段代码吗?
  • 如果有时服务器或服务器映射也来了,我尝试像这样/&lt;(server|server-mapping)&gt;/{:a;/&lt;\/(server|server-mapping)&gt;/!{N;ba;}}.. 编辑您的代码,但它不起作用帮助我
  • 您必须转义括号和管道:/&lt;\(server\|server-mapping\)&gt;/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 2022-09-23
  • 2012-09-24
  • 2014-12-17
  • 1970-01-01
相关资源
最近更新 更多