用 header 和主标签将 xml body 括起来

Enclose xml body with header and main tag

我有一个 xml 文件,其结构来自 xmllint:

<Entities>
    <Name>John</Name>
</Entities>
<Entities>
    <Name>David</Name>
</Entities>

现在我想将该文件转换为:

<?xml version="1.0" encoding="UTF-8"?>
<data>
   <Entities>
      <Name>John</Name>
   </Entities>
   <Entities>
      <Name>David</Name>
   </Entities>
</data>

我如何使用 sed 做到这一点?我试过这个

sed -e '1i\<?xml version="1.0" encoding="UTF-8"?><data>' test.xml > test1.xml

但还是缺少</data>。基本上我的想法是用 header 和一个名为 <data></data>

的主标签将 test.xml 中的文本括起来
sed -e '1i\<?xml version="1.0" encoding="UTF-8"?><data>' -e '$a\</data>' test.xml > test1.xml

这里的主要技巧是将 $a\</data> 放在它自己的 -e 标志后面,这样它就不会被解释为要在第一行之前插入的更多原始文本。

这会给你有效的 XML。对于问题中的精确输出,使用

sed -e '1i\<?xml version="1.0" encoding="UTF-8"?>' -e '1i\<data>' -e '$a\</data>' -e 's/^/    /'

左右。但是,如果是我,我只会使用 sed 使数据有效 XML 并使用那里的 XML 工具(即,使用第一个片段并通过 xmllint 进行缩进)。使用 sed 处理结构化数据通常很脆弱,因此您不希望这样做的时间超过必须的时间。