使用SED删除具有特定值的所有XML元素

时间:2015-11-30 15:27:18

标签: xml sed

我们使用一种工具(pentaho数据集成),它使用XML作为其文件的布局。它在这些文件中存储了太多信息(如连接信息)。在将文件推送到Git之前,我想清除所有使用JNDI的连接块。如果我使用XSLT(可能是这种可能性),将解析实体。这会导致Git每次进行小编辑时都会看到很多变化 - 显然是不可取的。

我有一个XML文件,其中包含以下行:

<connections>
   <connection>
      <name>connection1</name>
      <server/>
      <type>POSTGRESQL</type>
      <access>JNDI</access>
      <database>connections&#x2f;test&#x2f;connection1</database>
      <port>-1</port>
      <username/>
      <password>Encrypted </password>
   </connection>
   <connection>
      <name>test</name>
      <server>asdf</server>
      <type>ORACLE</type>
      <access>Native</access>
      <database>asdf</database>
      <port>1521</port>
      <username>asdf</username>
      <password>zcv</password>
   </connection>
</connections>

我想将其减少为:

<connections>
   <connection>
      <name>test</name>
      <server>asdf</server>
      <type>ORACLE</type>
      <access>Native</access>
      <database>asdf</database>
      <port>1521</port>
      <username>asdf</username>
      <password>zcv</password>
   </connection>
</connections>

我无法使用XSLT解析器(例如xmlstarlet),因为它将解析实体引用(&#x2f;变为/)。

我已经用sed尝试过了:

sed -ne '/<connection>/+.*/<access>/JNDI<\/access>/[\s\S]+.*<\/connection>/d'

但那里没有运气。

2 个答案:

答案 0 :(得分:3)

sed无法处理XML。如果您想要正确使用,请使用支持XML的工具。

xsltproc将是一个这样的工具。将它与XSL转换一起使用,如下所示:

<!-- dropJNDI.xsl -->    
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

    <!-- output every node unchanged -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- except connection nodes with access = JNDI, do not output them --> 
    <xsl:template match="connection[access = 'JNDI']" />
</xsl:transform>

使用

xsltproc dropJNDI.xsl input.xml > output.txt

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed '/<connection>/!b;:a;N;/<\/connection>/!ba;/<access>JNDI<\/access>/d' file

这会筛选出具有JNDI访问权限的连接。但是,只有在按原样显示XML时才会这样做。