完全な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>
今私のシェルスクリプトは、次の条件を検索します。
- 開始要素は次のようになります。
<midget
- 任意のタスク= "D"
- 次に、リスト要素name="%%PromotionProductInstanceId%%"で
- 次に、リスト要素の値="ALL"
その後、スクリプトはmidget要素からこれら2つのステートメントを削除する必要があります。
<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
そして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"]
- その後、スクリプトはmidget要素から次の2つのステートメントを削除する必要があります。
list[@name="%%PromotionProductInstanceId%%" or @value="ALL"]