我有一个看起来像这样的文件。
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>
标签