我们使用一种工具(pentaho数据集成),它使用XML作为其文件的布局。它在这些文件中存储了太多信息(如连接信息)。在将文件推送到Git之前,我想清除所有使用JNDI的连接块。如果我使用XSLT(可能是这种可能性),将解析实体。这会导致Git每次进行小编辑时都会看到很多变化 - 显然是不可取的。
我有一个XML文件,其中包含以下行:
<connections>
<connection>
<name>connection1</name>
<server/>
<type>POSTGRESQL</type>
<access>JNDI</access>
<database>connections/test/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),因为它将解析实体引用(/
变为/
)。
我已经用sed尝试过了:
sed -ne '/<connection>/+.*/<access>/JNDI<\/access>/[\s\S]+.*<\/connection>/d'
但那里没有运气。
答案 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时才会这样做。