使用命令行工具进行批量XML编辑

时间:2013-03-05 09:18:29

标签: linux command-line sed awk

我有数百个xml文件,我想在特定的地方进行一次编辑。在每个xml文件的某个地方,我都有类似的东西。

   <SomeTag
     attribute1 = "foo"
     attribute2 = "bar"
     attribute3 = "lol"/>

属性的数量及其名称会根据文件而变化,但SomeTag不会。我想在最后一个属性后添加另一个属性。

我意识到编辑xml这种方式很愚蠢,但是我只想做一些像sed这样的工作,但是我无法弄清楚多行的用法。 / p>

3 个答案:

答案 0 :(得分:3)

我会使用转换样式表和身份模板(XSLT)。

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="SomeTag">
  <xsl:copy>
    <xsl:attribute name="newAttribute">
      <xsl:value-of select="'whatever'"/>
    </xsl:attribute>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

这将复制整个XML,但会运行“SomeTag”的定义模板。

取自here

答案 1 :(得分:2)

您可以使用XML shell xsh

for my $file in { glob "*.xml" } {
    open $file ;
    for //SomeTag set @another 'new value' ;
    save :b ;
}

答案 2 :(得分:1)

如果您的输入文件非常简单且格式一致:

$ cat file
foo
   <SomeTag
     attribute1 = "foo"
     attribute2 = "bar"
     attribute3 = "lol"/>
bar

$ gawk -v RS='\0' -v ORS= '{sub(/<SomeTag[^/]+/,"&\n     attribute4 = \"eureka\"")}1' file
foo
   <SomeTag
     attribute1 = "foo"
     attribute2 = "bar"
     attribute3 = "lol"
     attribute4 = "eureka"/>
bar