【发布时间】:2016-01-19 03:33:33
【问题描述】:
我需要使用sed 或bash 脚本中的类似实用程序处理当前目录中的一组XML 文件。
在具有以下任一行的每个文件中(文件中可能有 0 或 1 行)
<MetaDatum key="Pr" value="VALUE (foobar)" />
<MetaDatum key="Pr" value="VALUE (xyz12345678)" />
我需要用
替换整行 <MetaDatum key="Pr" value="VALUE" />
所以我需要做的基本上是将VALUE (foobar) 和VALUE (xyz12345678) 映射到VALUE。
那么我应该在这个循环中使用什么操作:
for f in `grep -l "MetaDatum key=\"Pr\" value=\"VALUE" *.xml`
do
# replace one entire line in $f with '<MetaDatum key="Pr" value="VALUE" />'
done
【问题讨论】:
-
该行的其余部分有多少是您要编辑的行所独有的?
<MetaDatum够吗?你需要<MetaDatum key="Pr"吗?更多的?这些引号总是双引号吗?他们总是自己在线吗?如果您对这些问题没有可靠的答案,那么您可能应该考虑使用旨在操纵 XML 的东西。像 XSLT 或 xmlstarlet。 -
@EtanReisner:
grep -l返回文件。 -
是的,谢谢,忘记了
-l。你的 q 的其余部分:<MetaDatum key="Pr"就足够了。我需要修改的行总是自己的。是的,总是" -
顺便说一句,对于一般情况(不是 XML),这是一个常见问题解答:mywiki.wooledge.org/BashFAQ/021
-
除了我们已经提到的情况之外,
sed会做错事,顺便说一句。它对 XML cmets 一无所知;它对 CDATA 部分一无所知;它不知道如何转义值以使其在 XML 中有效(考虑您的值是否包含&amp;并且需要替换为&amp;以生成有效文件)。使用 XML 感知工具的部分优势在于,它们会以错误退出而不是生成无效的输出文件,但sed会整天生成无效的 XML 文件。