CLI命令来更新简单的XML文件

我想以编程方式更新一个非常简单的XMLconfiguration文件中的string,如下所示:

<?xml version="1.0"?> <x> <z>should be changed</z> </x> <y> <z>should NOT be changed</z> </y> 

有一个简单的CLI命令会更新x / z和NOT y / z吗? 也许使用XPathselect器参数,例如:

 $ xml-update myfile.xml /x/z "my new string" 

我可以用Perl或Python编写一些东西,但考虑到这个问题的简单性,我想必须有一个聪明的Unix工具来做到这一点。

更新 :我发现这个,但似乎有点矫枉过正。 我必须先学习XSLT。 http://developerblog.redhat.com/2013/12/05/xml-editing-bash-script/

您可以使用xml2 / 2xml工具在命令行上处理XML,而不用大惊小怪。 xml2将XML文档转换为适用于传统文本处理工具(如awksed的面向行的格式,而2xml采用此格式并将其转换回XML。

举个例子,如果我拿这个文件:

 <?xml version="1.0"?> <doc> <x> <z>should be changed</z> </x> <y> <z>should NOT be changed</z> </y> </doc> 

在该内容上运行xml2会产生:

 $ xml2 < doc.xml /doc/x/z=should be changed /doc/y/z=should NOT be changed 

我可以像这样修改<z>元素的内容

 xml2 < doc.xml | sed '/\/doc\/x\/z/ s/should be changed/look ma no hands/' | 2xml | tidyp -xml -i -q 

我正在使用sedsearchexpression式来明确查找以/doc/y/z开头的行,然后修改该行的内容,从而使我们可以:

 <doc> <x> <z>look ma no hands</z> </x> <y> <z>should NOT be changed</z> </y> </doc> 

我通过tidyp (一个XML格式化程序)传递了输出,因为否则文档将如下所示:

 <doc><x><z>look ma no hands</z></x><y><z>should NOT be changed</z></y></doc> 

…这是句法正确,但更难以阅读。