我有一个包含一些属性的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>
为什么标签中的/(斜杠)会被转义?
非常感谢你的帮助,
丹妮拉。
答案 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::Simple或PHP's SimpleXML。它不会是一个单行,但它会更可靠地工作。
答案 1 :(得分:0)
不要使用标准文本工具来处理XML - 始终使用XML工具。否则,您(或您的客户)将最终成为在此列表中发布问题的数百人之一,询问如何处理他们处理格式错误的XML这一事实。手动操作太难了,可以应对所有可能出现的边缘情况。例如,您是否知道开始和结束标记中允许空格的规则?从您的示例代码判断,您似乎没有。