特定の条件で特定の文字列を置き換えるシェルスクリプト

特定の条件で特定の文字列を置き換えるシェルスクリプト

完全な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"]

関連情報