Unix sed 出力が代替パターンとして 2 回表示されます。

Unix sed 出力が代替パターンとして 2 回表示されます。

XMLファイルがありますlogback-spring.xml

今、文字列が表示されるたびにDEBUGに置き換えたいと思います。TRACEref="logstash"次の行のみ

入力ファイルは次のとおりです。

  <logger name="com.abcd.tdi" level="DEBUG" additivity="false">
        <appender-ref ref="logstash"/>
        <appender-ref ref="Async-Appender"/>
    </logger>

  <springProfile name="dev">
        <logger name="com.abcd.tdi" level="DEBUG" additivity="false">
            <appender-ref ref="logstash"/>
        </logger>
  <springProfile name="dev">
        <logger name="com.abcd.tdi" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE"/>
        </logger>

コマンドを使用するとsed出力を取得します。二重交換中です。

次のsedコマンドを使用しました。

sed -n -e '/ref="logstash"/!h' -e '/ref="logstash"/{H;x;s/DEBUG/TRACE/}; p; ' logback-spring.xml

ベストアンサー1

次の正しい形式のXML文書が提供されています(例に合わせて変更されています)。

<?xml version="1.0"?>
<root>
  <springProfile name="dev">
    <logger name="com.abcd.tdi" level="DEBUG" additivity="false">
      <appender-ref ref="logstash"/>
      <appender-ref ref="Async-Appender"/>
    </logger>
  </springProfile>
  <springProfile name="dev">
    <logger name="com.abcd.tdi" level="DEBUG" additivity="false">
      <appender-ref ref="logstash"/>
    </logger>
  </springProfile>
  <springProfile name="dev">
    <logger name="com.abcd.tdi" level="DEBUG" additivity="false">
      <appender-ref ref="CONSOLE"/>
    </logger>
  </springProfile>
</root>

xmlstarlet次のように、子ノードの属性がusinglevelに設定されている各ノードのすべての属性を変更できますDEBUGTRACEloggerappender-refreflogstash

$ xmlstarlet ed -u '//logger[appender-ref/@ref = "logstash"]/@level[. = "DEBUG"]' -v 'TRACE' file.xml
<?xml version="1.0"?>
<root>
  <springProfile name="dev">
    <logger name="com.abcd.tdi" level="TRACE" additivity="false">
      <appender-ref ref="logstash"/>
      <appender-ref ref="Async-Appender"/>
    </logger>
  </springProfile>
  <springProfile name="dev">
    <logger name="com.abcd.tdi" level="TRACE" additivity="false">
      <appender-ref ref="logstash"/>
    </logger>
  </springProfile>
  <springProfile name="dev">
    <logger name="com.abcd.tdi" level="DEBUG" additivity="false">
      <appender-ref ref="CONSOLE"/>
    </logger>
  </springProfile>
</root>

XPathクエリは次のとおりです。チョロバは何を書くの?また働きます:

xmlstarlet ed -u '//logger[@level = "DEBUG"][appender-ref/@ref = "logstash"]/@level' -v 'TRACE' file.xml

おすすめ記事