Shell 脚本在某些条件下替换某些字符串

Shell 脚本在某些条件下替换某些字符串

我必须编写一个 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

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 元素中删除这两个语句:list[@name="%%PromotionProductInstanceId%%" or @value="ALL"]

相关内容