文字列を検索<oneFi institution="12345678">
して削除する必要があります<value maxPAN="19" minPAN="4" prefix="528749"/>
実際:
<oneFi institution="12345678">
<bin _list="1">
<value maxPAN="19" minPAN="4" prefix="528749"/>
<value maxPAN="19" minPAN="4" prefix="544448"/>
<value maxPAN="19" minPAN="4" prefix="557231"/>
</bin>
</oneFi>
<oneFi institution="854784662">
<bin _list="1">
<value maxPAN="19" minPAN="4" prefix="528749"/>
<value maxPAN="19" minPAN="4" prefix="544448"/>
</bin>
</oneFi>
期待される:
<oneFi institution="12345678">
<bin _list="1">
<value maxPAN="19" minPAN="4" prefix="544448"/>
<value maxPAN="19" minPAN="4" prefix="557231"/>
</bin>
</oneFi>
<oneFi institution="854784662">
<bin _list="1">
<value maxPAN="19" minPAN="4" prefix="528749"/>
<value maxPAN="19" minPAN="4" prefix="544448"/>
</bin>
</oneFi>
答え1
たとえば、XML文書が有効であると仮定すると、
<?xml version="1.0"?>
<root>
<oneFi institution="12345678">
<bin _list="1">
<value maxPAN="19" minPAN="4" prefix="528749"/>
<value maxPAN="19" minPAN="4" prefix="544448"/>
<value maxPAN="19" minPAN="4" prefix="557231"/>
</bin>
</oneFi>
<oneFi institution="854784662">
<bin _list="1">
<value maxPAN="19" minPAN="4" prefix="528749"/>
<value maxPAN="19" minPAN="4" prefix="544448"/>
</bin>
</oneFi>
</root>
(あなたの例にはルートノードはありません)
その後、XMLstarletを使用できます。
$ xmlstarlet ed -d '//oneFi[@institution="12345678"]//value[@prefix="528749"]' file.xml
<?xml version="1.0"?>
<root>
<oneFi institution="12345678">
<bin _list="1">
<value maxPAN="19" minPAN="4" prefix="544448"/>
<value maxPAN="19" minPAN="4" prefix="557231"/>
</bin>
</oneFi>
<oneFi institution="854784662">
<bin _list="1">
<value maxPAN="19" minPAN="4" prefix="528749"/>
<value maxPAN="19" minPAN="4" prefix="544448"/>
</bin>
</oneFi>
</root>
XPATH式は、ノードの属性と、選択したノードの下のどこかにあるノードの属性を使用して、//oneFi[@institution="12345678"]//value[@prefix="528749"]
質問で述べたノードと一致します。institution
oneFi
prefix
value
oneFi
ノード属性の値をより具体的に指定する必要がある場合は、次のようにvalue
他の属性を一致させることもできます。
value[@prefix="528749" and @maxPAN="19" and @minPAN="4"]
その表現部分です。
ed -d
XMLstarletコマンドの(または)ビットは、ed --delete
ユーティリティが次のことを行う必要があることを意味します。編集するXML文書と削除式に一致するノードです。
答え2
通常、またはなどのツールを使用してXMLを操作することは不可能ですsed
。一般的なXMLの場合は、XML構文解析ライブラリを使用してください。awk
grep
XMLファイルが常に同じ方法でフォーマットされている場合(たとえば、1行に1つのタグ、例と同じタグとネスト)などを使用できますawk
。
awk 'BEGIN { institutionMatch=0; skipValue=0; }
/<oneFi institution="[^"]*">/ { institutionMatch=0; } # assume other institution
/<oneFi institution="12345678">/ { institutionMatch=1; } # relevant institution
/<value maxPAN="19" minPAN="4" prefix="528749"\/>/ { if(institutionMatch)
skipValue=1; # mark to skip if found in matching institution
}
{ if(!skipValue) { print; } skipValue=0; }' inputfile > outputfile
注:XMLファイルが例とは異なるように見える場合、このスクリプトはガベージを生成できます。