用于更新XML文件数据的脚本

时间:2014-07-05 08:40:06

标签: xml bash shell awk sed

我需要通过搜索以下.xml文件中的avp名称来更新值字段。

 <avp name="CC-Request-Type" value="1"> </avp>
  <avp name="CC-Request-Number" value="0"> </avp>
  <avp name="Subscription-Id">
  <avp name="Subscription-Id-Type" value="0"></avp>
  <avp name="Subscription-Id-Data" value="4081234567"></avp>
  <avp name="Framed-IP-Address" value="0xXXXXX"> </avp>

我需要搜索行有#34; Framed-IP-Address&#34;将值0xXXXXX更新为0xYYYYY

请让我知道如何使用sed或AWK或shell脚本执行此操作将非常有用。

2 个答案:

答案 0 :(得分:2)

正确的工具是 XML-aware

XSLT(通过xsltproc)或您可以使用的任何通用脚本语言(Python,Ruby,Perl,node.js,甚至PHP-CLI)都是修改XML的合适工具的示例。 sed或awk或bash脚本是不合适的例子。

这是一个基于XSLT的解决方案

<!-- modify-Framed-IP-Address.xsl -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="node() | @*">
    <xsl:copy><xsl:apply-templates select="node() | @*" /></xsl:copy>
  </xsl:template>

  <xsl:template match="avp[@name = 'Framed-IP-Address']/@value">
    <xsl:attribute name="value">0xYYYYY</xsl:attribute>
  </xsl:template>
</xsl:stylesheet>

用作

xsltproc modify-Framed-IP-Address.xsl input.xml -o output.xml

将替换该属性并将结果保存到output.xml

如果您不想使用XSLT,请使用您知道的脚本语言。例如,基于Python的解决方案与这样一个简单任务的代码行数相差不到10行。请参阅this thread以了解如何开始。

答案 1 :(得分:1)

试试这个sed命令,

sed '/<avp name=\"Framed-IP-Address\"/s~value=\"[^"]*\"~value="0xYYYYY"~g' file

通过awk,

awk '/<avp name=\"Framed-IP-Address\"/{sub(/value=\"[^"]*\"/,"value=\"0xYYYYY\"")}1' file