且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

使用 sed 删除 xml 中的节点,如果它们包含某些文本

更新时间:2023-02-08 22:13:15

sed -ne '/rootNode/{ p; b }; /<appender /{ h; b }; /<logger /{ h; b }; H; /</logger>/{ x; p; b; }; /</appender>/{ x; /COM_Find[.]log/b; /COM_FIND[.]log/b; p }' file

输出:

<rootNode>  
   <appender name="CAT_FILE" class="org.apache.log4j.RollingFileAppender">
      <param name="File" value="C:/COM_Now.log"/>
      <param name="Threshold" value="INFO"/>
      <param name="Append" value="true"/>
      <param name="MaxFileSize" value="5000KB"/>
      <param name="MaxBackupIndex" value="2"/>
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
      </layout>
   </appender> 
    <appender name="SERVER_FILE" class="org.apache.log4j.RollingFileAppender">
         <param name="File" value="C:/COM_A.log"/>
         <param name="Threshold" value="INFO"/>
         <param name="Append" value="true"/>
         <param name="MaxFileSize" value="5000KB"/>
         <param name="MaxBackupIndex" value="5"/>
         <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
         </layout>
   </appender>   
   <logger name="com.mycompany">
      <level value="INFO"/>
      <appender-ref ref="SERVER_FILE"/>
    </logger>
</rootNode>

awk 的另一个:

awk '{ p = 1 } /<appender /{ t = $0; while (getline > 0) { t = t ORS $0; if (/COM_FIND[.]log/ || /COM_Find[.]log/) p = 0; if (/</appender>/) break } $0 = t } p' file

或者带有 IGNORECASE 的 GNU awk:

Or GNU awk with IGNORECASE:

gawk -v IGNORECASE=1 '{ p = 1 } /<appender /{ t = $0; while (getline > 0) { t = t ORS $0; if (/COM_FIND[.]log/) p = 0; if (/</appender>/) break } $0 = t } p' file