我有一个包含80,000个.xml文件的目录。我希望删除每个文件中的其余内容,只保留3个特定行。在每个文件中,行号保持不变(第41、65、120行)。或者,它们是包含特定字符串的行(“InvestorIndentifier”和“PoolID”)。有没有办法从文件中删除其余的内容,但只保留这些行在文件中?因为有这么大的文件量,我需要它是这样的东西,在整个批处理。
aij0ehis1#
您还没有明确表示是否希望剩下的内容是格式良好的XML。保留第41、65和120行而放弃其余行似乎不太可能生成格式良好的XML,因为您将丢失最外层的开始和结束标记。一般来说,强烈建议不要使用非XML工具处理XML文件,因为这通常会导致内容不是格式良好的XML。我们从试图处理格式错误的XML的人那里得到了大量的问题,这些问题通常正是由于有人试图走这条捷径而引起的。但是,在某些情况下,XML是如此规则和可预测,以至于您可能能够侥幸逃脱。这可能是这样的情况。然而,我自己的选择是用XSLT处理内容。在XSLT 2.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>
mzmfm0qo2#
使用sed。
sed
sed -i -r '/InvestorIndentifier|PoolID/!d' *.xml
!将反转匹配,因此这将删除与regexp(识别您要保留的特定字符串)不匹配的所有行。
!
2条答案
按热度按时间aij0ehis1#
您还没有明确表示是否希望剩下的内容是格式良好的XML。保留第41、65和120行而放弃其余行似乎不太可能生成格式良好的XML,因为您将丢失最外层的开始和结束标记。
一般来说,强烈建议不要使用非XML工具处理XML文件,因为这通常会导致内容不是格式良好的XML。我们从试图处理格式错误的XML的人那里得到了大量的问题,这些问题通常正是由于有人试图走这条捷径而引起的。但是,在某些情况下,XML是如此规则和可预测,以至于您可能能够侥幸逃脱。这可能是这样的情况。
然而,我自己的选择是用XSLT处理内容。在XSLT 2.0+中,可以使用collection()或uri-collection()函数来处理整个输入文件目录,使用xsl:result-document指令来生成输出文件。因此,使用Saxon,可以做如下操作:
mzmfm0qo2#
使用
sed
。!
将反转匹配,因此这将删除与regexp(识别您要保留的特定字符串)不匹配的所有行。