【问题标题】:replace xml value with sed [duplicate]用 sed 替换 xml 值 [重复]
【发布时间】:2014-06-26 22:25:04
【问题描述】:

我想替换 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

【问题讨论】:

  • 不是您问题的答案。但您也可以在命令行上使用“xmllint”。这直接处理 XML 结构。
  • 不要summon Cthulhu
  • @Wintermute for simple XML xml2 效果很好
  • 这不是重复的,因为 Q 准确地要求 sed

标签: xml bash sed


【解决方案1】:

你可以使用 xmlstarlet:

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

(或类似的东西)

【讨论】:

    【解决方案2】:

    xml2 套件可以很好地处理简单的 XML。

    您可以将 XML 转换为基于行的格式,然后像您习惯的那样处理。即:

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

    我对sed不是很精通,我相信你可以很容易地用sed替换perl

    【讨论】:

    • 非常有趣。但我更喜欢无 perl 的解决方案 ;-)
    • @choroba 好点。但我更不能使用 sed :-)
    【解决方案3】:
    sed -i -e '/<Console>/,/<\/Console>/ s|<node>[0-9a-z.]\{1,\}</node>|<node>newvalue</node>|g' YourFile
    

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

    如果newvalue是可变内容,别忘了使用双引号和转义字符&amp;\和sed的分隔符s操作(默认是/|在我的代码)

    【讨论】:

    • 感谢 NeronLeVelu,它成功了
    • 是的 newvalue 是一个变量,在那种情况下会怎样?
    • 如果 NewValue 不包含 & \,只需在 sed 操作上用双引号替换周围的简单引号。如果它包含那些字符,在字符串中使用它之前将它们转义并使用双引号
    • 非常感谢 NeronLeVelu。它奏效了。
    【解决方案4】:

    使用适当的 XML 解析器。例如,这是我在xsh 中要做的事情:

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

    【讨论】:

    • 非常有趣。但我更喜欢无 perl 的解决方案。
    猜你喜欢
    • 2017-03-07
    • 2018-07-28
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2014-01-09
    • 2017-01-06
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多