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

时间:2018-01-09 23:39:05

标签: 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>

1 个答案:

答案 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