Сценарий оболочки для замены определенных строк при определенных условиях

Мне нужно написать сценарий оболочки, который читает весь мой 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>

Теперь мой сценарий оболочки будет искать следующие условия:

  • Начальный элемент должен быть
  • , на котором действие = "D"
  • , затем в list element name = "%% PromotionProductInstanceId %%"
  • , затем в элементе списка value = "ALL"

Затем скрипт должен удалить оба этих утверждения из миниатюрного элемента.

<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
19.09.2017, 08:35
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"]
  • тогда скрипт должен удалить обе эти инструкции из миниатюрного элемента:list[@name="%%PromotionProductInstanceId%%" or @value="ALL"]
3
28.01.2020, 05:07

Теги

Похожие вопросы