如何替换xml文件标签值

如何替换xml文件标签值

这是我的示例 xml 文件 -

<appender name="SYSTEMLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  <level>INFO</level>
</filter>
<file>${cassandra.logdir}/system.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
  <fileNamePattern>${cassandra.logdir}/system.log.%i.zip</fileNamePattern>
  <minIndex>1</minIndex>
  <maxIndex>20</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
  <maxFileSize>20MB</maxFileSize>
</triggeringPolicy>
<encoder>
  <pattern>%-5level [%thread] %date{ISO8601} %F:%L - %msg%n</pattern>
</encoder>
</appender>


<!-- DEBUGLOG rolling file appender to debug.log (all levels) -->
<appender name="DEBUGLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${cassandra.logdir}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
  <fileNamePattern>${cassandra.logdir}/debug.log.%i.zip</fileNamePattern>
  <minIndex>1</minIndex>
  <maxIndex>20</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
  <maxFileSize>20MB</maxFileSize>
</triggeringPolicy>
<encoder>
  <pattern>%-5level [%thread] %date{ISO8601} %F:%L - %msg%n</pattern>
</encoder>
</appender>

我想更换-

<file>${cassandra.logdir}/system.log</file>
<fileNamePattern>${cassandra.logdir}/system.log.%i.zip</fileNamePattern>

${cassandra.logdir}/system.log with /var/log/cassandra/system.log

和类似的标签

<file>${cassandra.logdir}/debug.log</file>
<fileNamePattern>${cassandra.logdir}/debug.log.%i.zip</fileNamePattern>

${cassandra.logdir}/debug.log with /var/log/cassandra/debug.log

我尝试了几种使用 sed 的方法,但无法实现这一点。请帮助我使用我在 shell 脚本中使用的 sed 命令找出解决方案。

答案1

我将假设 XML 格式良好且语法正确。

使用 XML 处理器xmlstarlet

xmlstarlet edit \
    --update '//*[starts-with(text(),"${cassandra.logdir}")]' \
        --expr 'concat("/var/log/cassandra",substring-after(text(),"${cassandra.logdir}"))'  file.xml

这将更新文档中值恰好以特定字符串开头的任何节点的值${cassandra.logdir}。更新通过连接字符串/var/log/cassandra与从节点的原始值中删除字符串的结果来更改节点的值${cassandra.logdir}(实际上用新值替换字符串的前缀部分)。

相同的事情,但是使用内部变量作为查询和替换字符串。请注意,这些是 XPath 表达式,因此必须用引号引起来的字符串。

xmlstarlet edit \
    --var query '"${cassandra.logdir}"' \
    --var replacement '"/var/log/cassandra"' \
    --update '//*[starts-with(text(),$query)]' \
        --expr 'concat($replacement,substring-after(text(),$query))'  file.xml

相关内容