[英]Replace String in XML file
我嘗試用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>
我應該如何處理?
使用"[^"]*"
代替".*"
:
輸入:
<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>
這不使用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>
$ 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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.