使用sed删除包含特定值的xml标记

时间:2015-10-22 14:52:11

标签: regex bash sed

我有配置文件

<configuration>
 <property>
    <name>name1</name>
    <value>value1</value>
    <description>desc1</description>
</property>
 <property>
    <name>name2</name>
    <value>valueToRemove</value>
    <description>desc2</description>
 </property>
 <property>
    <name>name3</name>
    <value>value3</value>
    <description>desc3</description>
 </property>
 <property>
    <name>name3</name>
    <value>valueToRemove</value>
    <description>desc4</description>
 </property>
 <property>
    <name>name5</name>
    <value>valu5</value>
 </property>
</configuration>

我想删除包含值valueToRemove的所有属性标记。

我想要下一个输出

<configuration>
 <property>
    <name>name1</name>
    <value>value1</value>
    <description>desc1</description>
</property>
 <property>
    <name>name3</name>
    <value>value3</value>
    <description>desc3</description>
 </property>
 <property>
    <name>name5</name>
    <value>valu5</value>
 </property>
</configuration>

下一个bash脚本仅删除带有值标记的行。

sed -i "/[<property>].*valueToRemove.*[<\/property]>/d"  "test"

请帮助我,我是bash和regex的新手。

1 个答案:

答案 0 :(得分:1)

永远不要用正则表达式解析XML。它们是just the wrong tools for XML and its variants

真的,现在拥有一个XML解析器并不难。有很多图书馆和工具可以做到这一点;特别是如果你是bash编程的新手,为什么要使用它呢?

与操作系统角度与bash脚本的唯一区别,例如一个python脚本是他们的第一行,

#!/path/to/program/that/will/interpret/this/script

并且您可以使用任何脚本语言,例如python,它有一个很好的XML库。使用python和lxml,它只需几行代码,只要它是有效的XML,您就可以确定即使是最不可理解的sed可理解的XML也是正确的。 。

tl; dr:不要使用regexes / sed来解析XML。使用XML解析器。 Bash只是一个脚本解释器,还有更强大的脚本语言来处理这些任务。