нужно объединить только определенные строки файла xml вместе [дубликат]

0
18.11.2018, 21:14
3 ответа

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

sed -e '
    s/^[[:blank:]]*//
    \|<instruction>.*</instruction>|b
    \|<instruction>|,\|</instruction>|!b
    H;\|</instruction>|!d
    s/.*//;x;s/\n[[:blank:]]*//g;s/^\n//
' input_xml_lookalike_file
0
28.01.2020, 04:24

Для извлечения, например, значения узла valuesub -каждого узла instruction, который также имеет узел namesub -, значение которого равно Exterior Color, с использованием XMLStarlet:

xmlstarlet sel -v '//instruction[name = "Exterior Color"]/value' -nl file.xml

Учитывая файл

<?xml version="1.0"?>
<AssemblyHistory>
  <routing>
    <instruction>
      <name>Interior Finish</name>
      <value>WHITE</value>
      <type>0</type>
    </instruction>
    <instruction>
      <name>Exterior Color</name>
      <value>WHITE</value>
      <type>0</type>
    </instruction>
    <instruction>
      <name>Base Vinyl Color</name>
      <value>WHITE</value>
      <type>0</type>
    </instruction>
  </routing>
  <phantom>False</phantom>
</AssemblyHistory>

Это вернет строку WHITE.

Следующее будет возвращать каждый name, который соответствует значению WHITEво всех instructionузлах:

xmlstarlet sel -t -v '//instruction[value = "WHITE"]/name' -nl  file.xml
0
28.01.2020, 04:24

это почти работает:

awk 'BEGIN {RS="<instruction>"; FS="\n"; OFS=""} NR>1 {$1=RS; NF--; print}'

но он пропускает предыдущие строки и не прекращает объединение, когда видит тег /instruction

input:
LINE 0
LINE 1
LINE 2
<instruction>
<name>Glass SQFT</name>
<value>7.02</value>
<type>0</type>
</instruction>
LINE 3

output:
<instruction><name>Glass SQFT</name><value>7.02</value><type>0</type></instruction>LINE 3
0
28.01.2020, 04:24

Теги

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