在大量的XML文件中只保留某些字符串



我有一个包含80000个.xml文件的目录。我想从每个文件中删除除3行外的其余内容。在每个文件中,行#保持不变(第41、65、120行(。或者,它们是带有特定字符串("InvestorIndedentifier"one_answers"PoolID"(的行。

有没有办法从文件中删除其余内容,但只保留文件中的那些行?由于有这么大的文件量,我需要它是在整个批次上做这件事的东西。

您还没有明确表示是否希望保留的内容是格式良好的XML。保留第41、65和120行,同时丢弃其余行,似乎不太可能生成格式良好的XML,因为您将丢失最外层的开始和结束标记。

通常,强烈建议使用非XML工具处理XML文件,因为这通常会导致内容不是格式良好的XML。在这里,我们从试图处理格式错误的XML的人那里得到了大量的问题,这通常正是因为有人试图走这条捷径。然而,在某些情况下,XML是如此规则和可预测,以至于您可能能够逃脱惩罚,这可能就是这样的情况。

但是,我自己的选择是使用XSLT处理内容。在XSLT2.0+中,您可以使用collection((或uri-collection((函数来处理输入文件的整个目录,并使用xsl:result-document指令来生成输出文件。所以对于Saxon,你可以做这样的事情:

<xsl:transform version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template name="xsl:initial-template">
<xsl:for-each select="uri-collection('file:///my-input-directory/')">
<xsl:result-document href="replace(., 'my-input-directory', 'my-output-directory')">
<doc>
<xsl:copy-of select="doc(.)//(InvestorIdentifier|PoolID)"/>
</doc>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:transform>

使用sed

sed -i -r '/InvestorIndentifier|PoolID/!d' *.xml

!反转匹配,因此删除所有与识别要保留的特定字符串的正则表达式不匹配的行。

相关内容

  • 没有找到相关文章

最新更新