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

관련 정보