【问题标题】:sed replace xml headersed 替换 xml 标头
【发布时间】:2019-05-25 03:52:38
【问题描述】:

我正在使用 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 中尝试过,当我执行 ?&lt;\?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 中是否有这样做的方法吗?

【问题讨论】:

  • 不客气。如果某个答案解决了您的问题,请单击旁边的大复选标记 (✓) 接受它,并可选择对其进行投票(投票至少需要 15 个声望点)。如果您发现其他答案有帮助,请给他们投票。接受和投票有助于未来的读者。请看【相关帮助中心文章】[1] [1]:stackoverflow.com/help/someone-answers

标签: regex xml sed redhat


【解决方案1】:

如果您有格式良好的 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>

【讨论】:

  • 谢谢sed -E -i "/PurchaseOrder/s/&lt;\?xml version='1.0' encoding='UTF-8'\?&gt;//g" output.xml 解决了大部分问题,剩下的我可以用 XSLT 处理。
【解决方案2】:

这可能对你有用(GNU sed):

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

另一种选择:

sed '3,${/<\/\?PurchaseOrder>/!p;$!d}' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2017-09-06
    • 2015-06-01
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多