XMLファイルがありますlogback-spring.xml
。
今、文字列が表示されるたびにDEBUG
に置き換えたいと思います。TRACE
ref="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
に設定されている各ノードのすべての属性を変更できますDEBUG
。TRACE
logger
appender-ref
ref
logstash
$ 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
答え2
XMLで作業するときは、XML認識ツールを使用してください。例えば、xsh、ラッパーXML::LibXML、次のように結果を得ることができます。
open logback-spring.xml ;
for //logger[@level='DEBUG'][appender-ref/@ref='logstash']
set @level 'TRACE' ;
save :b ;
XMLに名前空間宣言が含まれていると、コードは少し複雑になります。