0

有一个 XML 文件包含如下内容

    <node1>
      bla
      <remove>
        abc
      </remove>
        kkk
    </node1>

我需要删除 node1 下的节点,但是有一些节点,比如<node9>也包含<remove>,不应该被删除,我想知道这样做,可能是 awk 脚本或 Python 或其他。

输出应该是

   <node1>
      bla
        abc
        kkk
    </node1>
4

4 回答 4

3

你应该知道使用文本处理来修改xml是有风险的。如果你必须这样做,这个 sed 单线应该适用于你的例子和 sudo 的答案中的例子

sed '/node1>/,/node1>/{/remove>/d}' file
于 2013-09-17T08:30:45.260 回答
2

使用以下输入:

$ cat file
<node1>
   bla
   <remove>
     abc
   </remove>
   kkk
</node1>
<node9>
   bla
   <remove>
     abc
   </remove>
   kkk
</node9>

以下脚本将使用删除所需的标签GNU awk

$ awk '/<node1>/{gsub(/<[/]?remove>/," ")}
       {printf "%s%s",$0,RT}' RS='</node[0-9]+>' file | grep '\S'
<node1>
   bla
     abc
   kkk
</node1>
<node9>
   bla
   <remove>
     abc
   </remove>
   kkk
</node9> 

如果在一行中找不到标签,该脚本甚至可以完成这项工作:

$ cat file
<node1>bla<remove>abc</remove>kkk</node1>
<node9>bla<remove>abc</remove>kkk</node9>

$ awk '/<node1>/{gsub(/<[/]?remove>/," ")}
       {printf "%s%s",$0,RT}' RS='</node[0-9]+>' file 
<node1>bla abc kkk</node1>
<node9>bla<remove>abc</remove>kkk</node9>
于 2013-09-17T08:05:39.667 回答
1

其他awk

awk '/node1>/,/\/node1>/ {if ($0~/remove>/) $0=""} NF'
于 2013-09-17T09:36:50.233 回答
1

我建议使用xml解析器。在中,一个好的方法是BeautifulSoup

from bs4 import BeautifulSoup
import sys

soup = BeautifulSoup(open(sys.argv[1], 'r'), 'xml')

for elem in soup.node1.children:
    if elem.name == 'remove':
        elem.decompose()

print(soup)
于 2013-09-17T09:45:21.907 回答