有一个XML文件包含像
这样的内容 <node1>
bla
<remove>
abc
</remove>
kkk
</node1>
我需要删除node1下的节点,但是有一些像<node9>
这样的节点也包含<remove>
,不应该删除它,我想知道这样做,可能是awk脚本或Python或者其他什么。
输出应为
<node1>
bla
abc
kkk
</node1>
答案 0 :(得分:3)
你应该知道使用文本处理来修改xml有风险。如果你必须这样做,这个sed单行应该适用于你的例子和sudo答案中的例子:
sed '/node1>/,/node1>/{/remove>/d}' file
答案 1 :(得分: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>
答案 2 :(得分:1)
另一个awk
awk '/node1>/,/\/node1>/ {if ($0~/remove>/) $0=""} NF'
答案 3 :(得分:1)
我建议使用xml
解析器。在python中,一个好的是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)