用标题和主标记括起xml正文

时间:2015-07-10 10:00:58

标签: xml linux sed xmllint

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

<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>。基本上我的想法是将test.xml中的文本与标题以及名为<data></data>

的主标记括起来。

1 个答案:

答案 0 :(得分:2)

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处理结构化数据通常很脆弱,因此您不希望这样做比您需要的更长。