1

Учитывая следующий вход:

<start>
   <header>
      This is header section
   </header>
   <body>
      <body_start>
         This is body section
         <a>
            <b>
               <c>
                  <st>111</st>
               </c>
               <d>
                  <st>blank</st>
               </d>
            </b>
         </a>
      </body_start>
      <body_section>
         This is body section
         <a>
            <b>
               <c>
                  <st>5</st>
               </c>
               <d>
                  <st>666</st>
               </d>
            </b>
            <b>
               <c>
                  <st>154</st>
               </c>
               <d>
                  <st>1457954</st>
               </d>
            </b>
            <b>
               <c>
                  <st>845034</st>
               </c>
               <d>
                  <st>blank</st>
               </d>
            </b>
         </a>
      </body_section>
   </body>
</start>

Я хотел бы выполнить следующий разбор.

Если st значение тега c равно 154 , то весь <b> to </b> необходимо удалить. Обратите внимание, что значение 154 может присутствовать или отсутствовать в файле.

Итак, если присутствует значение 154, то необходимо удалить следующую часть:

<b>
   <c>
      <st>154</st>
   </c>
   <d>
      <st>1457954</st>
   </d>
</b>

Я хочу сделать кодирование в сценарии оболочки. Я не могу использовать xslt потому что моя система не поддерживает его.

1 ответ1

0

Вы можете использовать pup, инструмент командной строки для обработки HTML. Для XML вы можете использовать xpup.

Например, чтобы найти детали для удаления, запустите:

$ pup ':parent-of(:parent-of(:contains("154")))' <file.html
<b>
 <c>
  <st>
   154
  </st>
 </c>
 <d>
  <st>
   1457954
  </st>
 </d>
</b>

Чтобы удалить этот раздел из ввода с помощью sed (где file.html - ваш HTML-файл), выполните:

 sed "s@$(pup ':parent-of(:parent-of(:contains("154")))' <file.html | xargs | tr -d " ")@@g" <(xargs <file.html | tr -d " ")

Заметки:

  • Мы используем xargs <file.html | tr -d " " чтобы свести файл в одну строку без пробелов.
  • Мы используем упомянутую команду pup чтобы найти шаблон для удаления.
  • Мы используем sed для удаления шаблона: sed "s@PATTERN@@g" <(input) .
  • Чтобы заменить на месте (путем изменения файла), добавьте -i для sed GNU или -i'.bak' для sed BSD.

Для облегчения понимания можно использовать следующий скрипт:

function flat_it() { xargs | tr -d " "; }
input=$(flat_it <file.html)
remove=$(pup ':parent-of(:parent-of(:contains("154")))' <<<$input | flat_it)
sed "s@$remove@@g" <<<$input

Примечание. Недостаток вышеуказанного метода заключается в том, что удаляются все пробелы, в том числе в содержимом. Чтобы сделать это лучше, необходимо использовать другой способ сглаживания входных данных.

Так что вместо xargs | Можно использовать xargs | tr -d " " , sed , ex или paste .

Вот пример использования ex:

ex +%j +"s/[><]\zs //g" +%p -scq! file.html

А вот версия с функцией оболочки (которая может заменить предыдущую версию):

function flat_it() { ex +%j +"s/[><]\zs //g" +%p -scq! /dev/stdin; }

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .