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を使っていくつかの方法を試しましたが、達成できませんでした。シェルスクリプトで使用されている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

関連情報