【发布时间】:2019-08-07 01:04:24
【问题描述】:
下面是我用于监控系统的配置文件,我想通过 linux bash 更改下面文件中的字符串。
我想扫描完整的文件并查找 default_not_os_not_oracle 块,然后将我看到的 testemail 字符串更改为仅在 default_not_os_not_oracle 块中的 alertmail。 我不介意在 python/perl/sed/awk 方式的解决方案中获得帮助
#<!-- language: lang-xml -->
<instance:default_oracle>
<map>
/ora.*
/arch.*
</map>
<mail>
<to> %DBA% </to>
</mail>
</instance>
<instance:default_not_os_not_oracle>
<map> (?!/$|/users|/auto|/dev|/tmp|/var|/ora|/arch).* </map>
<action> mail </action>
<mail>
<to> testemail </to>
</mail>
</instance>
<instance:diskmon>
<warn>
<ge> 75 </ge>
<action> mail </action>
</warn>
<crit>
<ge> 90 </ge>
<action> page,mail </action>
</crit>
<map>
/apps
</map>
<mail> <to> abc@gmail.com </to> </mail>
<page> <to> abc@gmail.com </to> </page>
</instance>
#
【问题讨论】:
-
考虑使用适当的 XML 解析器 bc sed 不适用于此类任务。
-
最好的方法是使用 XML 解析器,例如 xmlstarlet 或直接使用 xslt,两者都基于 xpath。通常不建议使用
sed或awk等工具或任何其他基于行的处理工具来更改XML文件,因为它们具有复杂的结构。对于一次性任务,如果您确切知道事物的外观,那通常不是问题。但是,如果您不知道文件的外观,或者您必须做无数次,请使用 XML 解析器。