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