awk one liner:替换xml标签

时间:2012-09-07 10:59:12

标签: xml replace awk

我有一个包含一些属性的xml文件,比如

<string name="my/ attribute" optional="true">
  <description>some text</description>
  <value>some text again</value>
</string>

我想通过字符串“none”更改值(不一定必须是“some text”)。我在命令行上尝试了以下内容:

 awk '/<string name="my\/ attribute" optional="true">/,/<\/string>/ {sub(/<value>(.*)<\/value>/,"<value>none</value>")}1' my.xml > my_new.xml

这种方式可行,但结果如下:

<string name="my/ attribute" optional="true">
  <description>some text</description>
  <value>some text again<\/value>
</string>

为什么标签中的/(斜杠)会被转义?

非常感谢你的帮助,

丹妮拉。

2 个答案:

答案 0 :(得分:1)

假设理查德指出的问题中的不一致是偶然的:

$ cat input.xml
<string name="my/ attribute" optional="true">
  <description>some text</description>
  <value>some text again</value>
</string>

$ awk '/<string/{doit=1} doit{sub(/<value>[^<]+<\/value>/, "<value>none</value>"); print} /<\/string>/{doit=0}' input.xml 
<string name="my/ attribute" optional="true">
  <description>some text</description>
  <value>none</value>
</string>

$ 

这比你的脚本更安全,因为它将处理缩小的XML(即删除空格,全部在e线上),但它不会处理多行分割的<value>

我建议您查看Perl's XML::SimplePHP's SimpleXML。它不会是一个单行,但它会更可靠地工作。

答案 1 :(得分:0)

不要使用标准文本工具来处理XML - 始终使用XML工具。否则,您(或您的客户)将最终成为在此列表中发布问题的数百人之一,询问如何处理他们处理格式错误的XML这一事实。手动操作太难了,可以应对所有可能出现的边缘情况。例如,您是否知道开始和结束标记中允许空格的规则?从您的示例代码判断,您似乎没有。