我必须编写一个 shell 脚本来读取整个 xml 文件并搜索,如果满足某些条件,则它会删除一些特定的行。
假设我的xml是这种形式
<midget action="D">
<lists operator="AND">
<list name="productCode" value="XW143215" actionoperator="in"
oldoperator="in" type="string" />
<list name="%%PromotionProductInstanceId%%" value="z" product="S0000001.S0145868"
actionoperator="in" operator="=" oldoperator="in" type="string" />
<list name="Type" value="ALL" product="PQRAccess" type="string" />
<lists id="Prim" />
</lists>
</midget>
<midget action="Y">
<lists operator="AND">
<list name="productCode" value="XW143215" actionoperator="in"
oldoperator="in" type="string" />
<list name="Y" value="z" product="S0000001.S0145868"
actionoperator="in" operator="=" oldoperator="in" type="string" />
<list name="Type" value="ALL" product="PQRAccess" type="string" />
<lists id="Trim" />
</lists>
</midget>
<midget action="D">
<lists operator="AND">
<list name="productCode" value="XW143215" actionoperator="in"
oldoperator="in" type="string" />
<list name="%%PromotionProductInstanceId%%" value="z" product="S0000001.S0145868"
actionoperator="in" operator="=" oldoperator="in" type="string" />
<list name="Type" value="ALL" product="PQRAccess" type="string" />
<lists id="Trim" />
</lists>
</midget>
现在我的 shell 脚本将搜索这些条件:
- 起始元素应该是
<midget
- 哪个动作=“D”
- 然后在列表元素 name="%%PromotionProductInstanceId%%"
- 然后在列表元素值=“ALL”
然后脚本应该从 midget 元素中删除这两个语句。
<list name="%%PromotionProductInstanceId%%" value="z" product="S0000001.S0145868"
actionoperator="in" operator="=" oldoperator="in" type="string" />
<list name="Type" value="ALL" product="PQRAccess" type="string" />
我已经尝试过 sed 但我无法弄清楚如何根据上述条件执行搜索。任何帮助,将不胜感激。
答案1
xml ed -d '//midget[@action="D"]/*[
descendant::list[@name="%%PromotionProductInstanceId%%"] and
descendant::list[@value="ALL"]]/list[
@name="%%PromotionProductInstanceId%%" or @value="ALL"]' <file.xml
详细地:
- 起始元素应该是
<midget
://midget
- 其上
action="D"
:[@action="D"]
- 然后在列表元素中
name="%%PromotionProductInstanceId%%"
:descendant::list[@name="%%PromotionProductInstanceId%%"]
- 然后在列表元素中
value="ALL"
:descendant::list[@value="ALL"]
- 那么脚本应该从 midget 元素中删除这两个语句:
list[@name="%%PromotionProductInstanceId%%" or @value="ALL"]