我有配置文件
<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的新手。
答案 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只是一个脚本解释器,还有更强大的脚本语言来处理这些任务。