在 xml 标签中查找字符串并删除属于 match 标签一部分的行

在 xml 标签中查找字符串并删除属于 match 标签一部分的行

需要搜索一个字符串<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 命令的(or )位ed --delete意味着该实用程序应该编辑XML 文档和删除与表达式匹配的节点。

答案2

一般来说,不可能使用sedawk或等工具来操作 XML grep。对于一般 XML,请使用 XML 解析库。

如果您的 XML 文件始终以相同的方式格式化,即每行一个标记,与您的示例中相同的标记嵌套,则可以使用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 文件看起来与示例不同,则此脚本可能会产生垃圾。

相关内容