0

次のようなコンテンツを含むXMLファイルがあります

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

node1 の下のノードを削除する必要がありますが、 <node9>contains のようなノードもありますが<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> 

タグが 1 行で見つからない場合でも、スクリプトはジョブを実行します。

$ 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

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 に答える
1

awk

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