我有一项任务,我在理解如何在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>
答案 0 :(得分:1)
使用sed解析XML容易出错。而是将您的输入转换为有效的XML,例如与GNU sed:
\n -> do ...
现在使用xmlstarlet中的XPATH编辑数据,例如:
<infile.xml sed -e '1i\<xml>' -e '$a\</xml>'
输出:
<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