将多个XML元素从单个文件分配到多个文件中



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

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个文件中重复1000次<element>....</element>,我想将其变成1000个文件。

我敢肯定,Unix公用事业(如Awk或Sed(有一种方法,但我不确定如何完成。

谢谢

a gawk hack ...

$ 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>

替代 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>标签

最新更新