xml - 如何在 Linux 中使用 sed 更改 XML 文件中的值?

标签 xml linux bash sed

我有一项任务,但在理解如何更改 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 解析 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>

关于xml - 如何在 Linux 中使用 sed 更改 XML 文件中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48178243/

相关文章:

linux - 如何在 shell 中实现内置命令?

javascript - xml 标记的编码错误

xml - 如何对 XSLT/XPATH 中的一组节点进行不区分大小写的查找?

java - Hibernate 和 MappingNotFoundException

python - 使用 OLE 工具从 Python (Linux) 中的 VSD(Windows Visio 二进制)文件读取数据非常不清楚,还有其他方法可以提取数据吗?

linux - 从 makefile 管道两个命令不起作用

sql - 来自 SQL 列 : Cannot call methods on nvarchar(max) 的 XML

linux - 未找到 header openfst

c - c中的信号和输出

linux - 在 bash 中计算文件中的单词出现次数