将多个XML元素从单个文件拆分为多个文件

时间:2017-05-02 17:45:51

标签: xml bash awk sed

我有一个看起来像这样的文件。

a
B abc
c abc
d abc
e abc
<stuff></stuff><?xml version="1.0" encoding="UTF-8" standalone="yes"?><element><moreelements>1</moreelements></element>

a
B abc
c abc
d abc
e abc
<stuff></stuff><?xml version="1.0" encoding="UTF-8" standalone="yes"?><element><moreelements>1234</moreelements></element>

a
B abc
c abc
d abc
e abc
<stuff></stuff><?xml version="1.0" encoding="UTF-8" standalone="yes"?><element><moreelements>12354</moreelements></element>

a
B abc
c abc
d abc
e abc
<stuff></stuff><?xml version="1.0" encoding="UTF-8" standalone="yes"?><element><moreelements>12534</moreelements></element>

a
B abc
c abc
d abc
e abc
<stuff></stuff><?xml version="1.0" encoding="UTF-8" standalone="yes"?><element><moreelements>12634</moreelements></element>

如果数量很多,请重复1000多个相似的项目。

我想阅读该文件,将每个<element>提取到自己的文件中。

因此,对于1文件,我想创建多个包含以下文本的文件:

<element><moreelements>1</moreelements></element>

我更愿意保留XML声明<?xml version="1.0" encoding="UTF-8" standalone="yes"?>,但这不是必需的。

因此如果{1}在1个文件中重复1000次,我想把它变成1000个文件。

我确定使用像awk或sed这样的unix实用程序,但我不知道如何实现它。

由于

2 个答案:

答案 0 :(得分:2)

gawk黑客......

$ tag="element>"; awk -v RS="</?$tag" -v t="$tag" '
       !(NR%2){print "<"t $0 "</"t > "element_"++c".xml"}' file

$ head element_*

==> element_1.xml <==
<element><moreelements>1</moreelements></element>

==> element_2.xml <==
<element><moreelements>1234</moreelements></element>

==> element_3.xml <==
<element><moreelements>12354</moreelements></element>

==> element_4.xml <==
<element><moreelements>12534</moreelements></element>

==> element_5.xml <==
<element><moreelements>12634</moreelements></element>

答案 1 :(得分:1)

替代 gawk 方法:

awk '$0~/<element>/{match($0, /<element>.+<\/element>/); 
     print substr($0,RSTART,RLENGTH) > "el_"++c".xml"}' file
head el_*
==> el_1.xml <==
<element><moreelements>1</moreelements></element>

==> el_2.xml <==
<element><moreelements>1234</moreelements></element>

==> el_3.xml <==
<element><moreelements>12354</moreelements></element>

==> el_4.xml <==
<element><moreelements>12534</moreelements></element>

==> el_5.xml <==
<element><moreelements>12634</moreelements></element>

$0~/<element>/ - 仅考虑<element>代码

的行

match($0, /<element>.+<\/element>/) - 匹配整个<element>代码