需要搜索一个字符串<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 命令的(or )位ed --delete
意味着该实用程序应该编辑XML 文档和删除与表达式匹配的节点。
答案2
一般来说,不可能使用sed
、awk
或等工具来操作 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 文件看起来与示例不同,则此脚本可能会产生垃圾。