我有一个看起来像这样的文件。
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实用程序,但我不知道如何实现它。
由于
答案 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>
代码