【问题标题】:Delete nodes in xml if they contain certain text using sed使用 sed 删除 xml 中的节点,如果它们包含某些文本
【发布时间】:2014-09-19 07:12:05
【问题描述】:

我有一个如下所示的 xml。

<rootNode>  
   <appender name="SERVER_FILE" class="org.apache.log4j.RollingFileAppender">
      <param name="File" value="C:/COM_FIND.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>   
   <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>   
    <appender name="SERVER_FILE" class="org.apache.log4j.RollingFileAppender">
         <param name="File" value="C:/COM_Find.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>

是的。它是 log4j xml 的摘录。我基本上想要做的是使用 sed 命令删除所有包含单词“COM_Find.log”的附加标签/元素(来自)。 到目前为止我所拥有的是:-

sed -e '/<appender/,/<\/appender>/{H;$!d;}' -e 'x;/COM_Find.log/d' file.xml

从第一个 appender 到最后一个 appender 进行贪婪搜索,并删除其间的所有内容。我只想删除那些特定的附加标签/元素(来自)。

输出应该是:-

<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>

有人可以帮我吗?

【问题讨论】:

  • 我相信一般来说有更好的工具..
  • 只删除 appender 标签还是删除整个 appender 块?
  • 包含搜索文本的从 的整个 appender 标签。在​​这种情况下,搜索文本为“COM_Find.log”。

标签: xml bash awk sed


【解决方案1】:
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

或 GNU awk 与 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

【讨论】:

  • 感谢您的回复。我已经用输出的外观更新了我的答案。这个仍然有第一个带有文本 COM_Find.log 的附加程序。
  • @user3824306 已更新。
  • @user3824306 这会更复杂。我建议改用XMLStarlet
  • 感谢..它与 awk 实用程序一起使用...一个问题..如果我没有错,此命令假定文本将在“ 的行中有搜索文本
  • @user3824306 它只能与扩展为多行的每个元素一起使用。精简形式需要更困难的方法。
【解决方案2】:

我不明白你要删除整行吗?

如果可以,你可以grep

grep -v "COM_Find.log" yourfile.xml > newfile.xml

【讨论】:

  • 的整个 appender 标记包含搜索文本。在这种情况下,搜索文本为 'COM_Find.log'
猜你喜欢
  • 2020-08-22
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 2011-09-27
  • 2021-03-22
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
相关资源
最近更新 更多