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

e5nqia27  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(150)

我有一个包含80,000个.xml文件的目录。我希望删除每个文件中的其余内容,只保留3个特定行。在每个文件中,行号保持不变(第41、65、120行)。或者,它们是包含特定字符串的行(“InvestorIndentifier”和“PoolID”)。
有没有办法从文件中删除其余的内容,但只保留这些行在文件中?因为有这么大的文件量,我需要它是这样的东西,在整个批处理。

aij0ehis

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>
mzmfm0qo

mzmfm0qo2#

使用sed

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

!将反转匹配,因此这将删除与regexp(识别您要保留的特定字符串)不匹配的所有行。

相关问题