【问题标题】:How to change value in XML file using sed in Linux?如何在 Linux 中使用 sed 更改 XML 文件中的值?
【发布时间】:2018-06-19 01:57:27
【问题描述】:

我有一个任务,但在理解如何在 Linux 中更改 XML 文件中两个不同节点的值时遇到了一些麻烦,但其中的标签相同。

我有这个 XML 文件:

<logger name="my.test.module">
  <level value="error"/>
  <appender-ref ref="file-module"/>
</logger>

<logger name="my.test.module2">
  <level value="error"/>
  <appender-ref ref="file-module2"/>
</logger>

在使用sed之后,是否有可能得到这样的结果?

你好雷神。不幸的是,我使用的是基于 Windows 的 xmlstarlet,因为在目标操作系统上无法安装它。

我想按照你的建议去做

xml edit -S -O \
  --update '/log4j:configuration/logger[@name="ru.crystals.transport"]/level/@value' \
  --value all log4j.xml

但是什么也没发生。

文件部分如下:

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<logger name="my.test.module">
        <level value="error"/>
        <appender-ref ref="file-module"/>
    </logger>

    <logger name="my.test.module2">
        <level value="error"/>
        <appender-ref ref="file-module2"/>
    </logger>
</log4j:configuration>

【问题讨论】:

  • 最好的方法不是sed,而是xsltproc,一个Linux XSLT处理器。

标签: xml linux bash sed


【解决方案1】:

使用 sed 解析 XML 很容易出错。相反,将您的输入转换为有效的 XML,例如使用 GNU sed:

<infile.xml sed -e '1i\<xml>' -e '$a\</xml>'

现在在 xmlstarlet 中使用 XPATH 编辑数据,例如:

<infile.xml sed -e '1i\<xml>' -e '$a\</xml>'                |
xmlstarlet edit -S -O                                       \
  --update '//logger[@name="my.test.module"]/level/@value'  \
  --value  all                                              \
  --update '//logger[@name="my.test.module2"]/level/@value' \
  --value  trace

输出:

<xml>
<logger name="my.test.module">
  <level value="all"/>
  <appender-ref ref="file-module"/>
</logger>

<logger name="my.test.module2">
  <level value="trace"/>
  <appender-ref ref="file-module2"/>
</logger>
</xml>

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 2023-04-09
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2020-09-11
    • 2016-01-14
    相关资源
    最近更新 更多