xml タグで文字列を検索し、一致タグの一部である行を削除します。

xml タグで文字列を検索し、一致タグの一部である行を削除します。

文字列を検索<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"]質問で述べたノードと一致します。institutiononeFiprefixvalueoneFi

ノード属性の値をより具体的に指定する必要がある場合は、次のようにvalue他の属性を一致させることもできます。

value[@prefix="528749" and @maxPAN="19" and @minPAN="4"]

その表現部分です。

ed -dXMLstarletコマンドの(または)ビットは、ed --deleteユーティリティが次のことを行う必要があることを意味します。編集するXML文書と削除式に一致するノードです。

答え2

通常、またはなどのツールを使用してXMLを操作することは不可能ですsed。一般的なXMLの場合は、XML構文解析ライブラリを使用してください。awkgrep

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ファイルが例とは異なるように見える場合、このスクリプトはガベージを生成できます。

関連情報