Мне нужно написать сценарий оболочки, который читает весь мой 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>
Теперь мой сценарий оболочки будет искать следующие условия:
Затем скрипт должен удалить оба этих утверждения из миниатюрного элемента.
<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, но не могу понять, как выполнять поиск на основе вышеуказанных условий. Любая помощь будет оценена.
С помощью XmlStarlet:
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"]
list[@name="%%PromotionProductInstanceId%%" or @value="ALL"]