替换XML文件中的String

时间:2014-07-16 21:28:44

标签: regex sed

我尝试用sed替换XML文件中的字符串,但由于它的正则表达式不支持非贪婪表达式,我遇到了问题。

XML示例:

<opt>
  <Node active="yes" file="/home/user/random_filename" last_time="17/07/14-00:02:07" time_in_min="5" />
</opt>

我想找到文件属性,即随机字符串,并将其替换为另一个字符串。

此命令替换字符串,但BUT删除尾随数据。

sed 's/file=".*"/file="new_file_name"/' file.xml

输出:

<opt>
   <Node active="yes" file="new_file_name" />
</opt>

我该如何处理?

3 个答案:

答案 0 :(得分:2)

使用"[^"]*"代替".*"

输入:

<opt>
  <Node active="yes" file="/home/user/random_filename" last_time="17/07/14-00:02:07" time_in_min="5" />
</opt>

命令:

sed 's/file="[^"]*"/file="new_file_name"/'

输出:

<opt>
  <Node active="yes" file="new_file_name" last_time="17/07/14-00:02:07" time_in_min="5" />
</opt>

答案 1 :(得分:1)

这不使用sed但是在操作xml文档时,您可能需要考虑xslt。它可能是您问题的最佳解决方案,但它非常适合使用xml。

filter.xsl:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" omit-xml-declaration="yes"/>

<!-- The replacement string is passed as a parameter.
     You can have as many param elements as you need. -->
<xsl:param name="NEW_NAME"/>

<!-- Copy all attributes and nodes... -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<!-- ...but when you encounter an element with a file attribute,
     replace it with the value passed in the parameter named $NEW_NAME. -->
<xsl:template match="@file">
    <xsl:attribute name="file">
        <xsl:value-of select="$NEW_NAME"/>
    </xsl:attribute>
</xsl:template>

</xsl:stylesheet>

libxslt示例(添加所需的--stringparam名称/值对):

xsltproc --stringparam NEW_NAME new_file_name filter.xsl file.xml

结果:

<opt>
    <Node active="yes" file="new_file_name" last_time="17/07/14-00:02:07" time_in_min="5"/>
</opt>

答案 2 :(得分:0)

$ sed 's/\(.*file="\)[^"]*/\1new_file_name/' file
<opt>
  <Node active="yes" file="new_file_name" last_time="17/07/14-00:02:07" time_in_min="5" />
</opt>