用sed替换xml值

时间:2014-05-09 08:43:29

标签: xml bash sed

我想替换XML文件中的值。示例XML

<Console>
                <!-- REQUIRED PARAMETERS -->
                <!-- Enter the node that you are running the installation program from. This value must be a fully qualified name, which includes a host name and domain name. For example, node001.server.name.com.-->
                <node>node.sample.ibm.com</node>

                <!-- Enter the domain name of the cluster as a single dot-separated string. For example, server.name.com. -->
        <sso-domain-name>sample.ibm.com</sso-domain-name>

        <!-- Set this property to true if your InfoSphere BigInsights Console uses HTTPS. Otherwise, enter false. -->
                <https>false</https>

        <!-- management-console-port specifies which port is used by the Management Console. -->
        <management-console-port>8080</management-console-port>

我想取代价值。 我尝试了以下,但它不起作用。任何帮助赞赏。

sed -i "/<Console>/,/<\/Console>/ s/<node>[0-9][a-z]\+/<node>newvalue

4 个答案:

答案 0 :(得分:8)

sed -i -e '/<Console>/,/<\/Console>/ s|<node>[0-9a-z.]\{1,\}</node>|<node>newvalue</node>|g' YourFile

我假设价值在您的标签之间,并且只包含小写字母,点和数字(基于您的样本和尝试)。如果扩展,只需在类[0-9a-z._-A-Z:]中添加缺少的字符,也可以添加子类[:space:]

如果newvalue是变量内容,请不要忘记使用双引号和转义字符&\以及sed s操作的分隔符(默认为{{我的代码中有1}}和/

答案 1 :(得分:5)

您可以使用xmlstarlet:

xmlstarlet ed -u //Console/node -v 'new value'

(或类似的东西)

答案 2 :(得分:2)

可以使用xml2套件轻松处理简单XML。

您可以将XML转换为基于行的格式,并按照您习惯的方式进行处理。即:

xml2 < x.xml | perl -pe 's|^(/Console/node=)(.*)$|$1newvalue|g' | 2xml > y.xml

我不太熟悉 sed 我相信你可以轻松地用 sed 替换 perl

答案 3 :(得分:1)

使用正确的XML解析器。例如,我将在xsh中做什么:

open 1.xml ;
for //Console/node {
    if xsh:matches(., '[0-9][a-z]+') set text() 'newvalue' ;
}
save :b ;