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