sed заменяет заголовок xml - PullRequest
0 голосов
/ 27 декабря 2018

Я использую RedHat Linux и сгенерировал огромный XML-документ, выполнив что-то вроде

while read -r Id; do
curl -X Get "http://ip/api >> $outputfilename
done

, тогда файл результата будет выглядеть примерно так

<?xml version='1.0' encoding='UTF-8'?>
<PurchaseOrder>
<somemanytags/>
</PurchaseOrder><?xml version='1.0' encoding='UTF-8'?>
<PurchaseOrder>
<somemanytags/>
</PurchaseOrder><?xml version='1.0' encoding='UTF-8'?>
<PurchaseOrder>
<somemanytags/>
</PurchaseOrder><?xml version='1.0' encoding='UTF-8'?>
<PurchaseOrder>
<somemanytags/>
</PurchaseOrder>

Теперь я хотел быудалите ?xml заголовки и промежуточные теги, чтобы целевой файл должен был выглядеть следующим образом.

<?xml version='1.0' encoding='UTF-8'?>
<PurchaseOrder>
<somemanytags/>
<somemanytags/>
<somemanytags/>
<somemanytags/>
</PurchaseOrder>

Я пробовал в vi, когда я делаю что-то вроде ?<\?xml\ version=\'1\.0\'\ encoding=\'UTF\-8\'\?, оно может совпадать с xml version='1.0' encoding='UTF-8', но не можеткажется, может соответствовать за этой точкой.Также я пробовал sed -i -e "s/xml\ version\'1\.0\'\ encoding=\'UTF\-8\'//g" outputfilename.xml, но, похоже, он не работает с файлом.Могу ли я узнать, есть ли способ сделать это в sed?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Это может работать для вас (GNU sed):

sed '/^<\/PurchaseOrder><?xml/,/^<PurchaseOrder>/d' file

Альтернатива:

sed '3,${/<\/\?PurchaseOrder>/!p;$!d}' file
0 голосов
/ 27 декабря 2018

Если бы у вас был правильно сформированный XML, я бы использовал XSLT или другую технологию XML для его очистки.

Если вы выберете решение sed, вы можете использовать:

ВХОД:

cat broken_xml
<?xml version='1.0' encoding='UTF-8'?>
<PurchaseOrder>
<somemanytags/>
</PurchaseOrder><?xml version='1.0' encoding='UTF-8'?>
<PurchaseOrder>
<somemanytags/>
</PurchaseOrder><?xml version='1.0' encoding='UTF-8'?>
<PurchaseOrder>
<somemanytags/>
</PurchaseOrder><?xml version='1.0' encoding='UTF-8'?>
<PurchaseOrder>
<somemanytags/>
</PurchaseOrder>

ВЫХОД:

sed -E "/PurchaseOrder/s/<\?xml version='1.0' encoding='UTF-8'\?>//g" broken_xml 
<?xml version='1.0' encoding='UTF-8'?>
<PurchaseOrder>
<somemanytags/>
</PurchaseOrder>
<PurchaseOrder>
<somemanytags/>
</PurchaseOrder>
<PurchaseOrder>
<somemanytags/>
</PurchaseOrder>
<PurchaseOrder>
<somemanytags/>
</PurchaseOrder>
...