0

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

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

我想通过字符串“none”更改值(不一定必须是“一些文本”)。我在命令行上尝试了以下操作:

 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>

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

非常感谢你的帮助,

丹妮拉。

4

2 回答 2

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 的 XML::SimplePHP 的 SimpleXML。它不会是单行的,但它会更可靠地工作。

于 2012-09-07T11:37:28.190 回答
0

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

于 2012-09-07T14:30:50.843 回答