鉴于XML文件,我想提取模式之间的所有字符串并放入单独的文件,最好使用sed,awk,grep等bash工具...
例如,如果我有XML文件,请使用分隔符标记a:
<a><b>yada</b>
<c>yada</c>
</a><a>
foo</a>
<a>bar</a>
我想要包含以下文件:
<a><b>yada</b>
<c>yada</c>
</a>
第二个:
<a>
foo</a>
第三个:
<a>bar</a>
答案 0 :(得分:3)
我使用的是Python,它的标准库中有一个XML解析器。例如:
#!/usr/bin/python
import xml.dom.minidom as DOM;
import sys;
# first parameter is input file
dom = DOM.parse(sys.argv[1])
i = 0
# find, iterate through all 'a' tags
for tag in dom.getElementsByTagName('a'):
# Using filenames output1.xml, output2.xml etc.
# Change format string as required.
i = i + 1
with open('output{}.xml'.format(i), 'w') as f:
print >> f, tag.toxml()
另存为foo.py
,请致电
python foo.py input.xml
(或./foo.py input.xml
后的chmod +x
)
答案 1 :(得分:2)
使用您的样本,并假设标签内没有</a>
sed '1!H;1h;$!d
x
s#\(.*</a>\).*$#\1#
s/\(<a>.*\)$/\1/
s/<a>/\
&/g
s#</a>#&\
#g' YourFile \
| awk 'BEGIN {Index=0}
/<a>/,/<\/a>/{if ( index( $0, "<a>") > 0) Index++
print $0 >> "File."Index
}'
<a>...</a>
标记<a>...</a>
子字符串分隔为段落(在输出操作部分的同一个awk中对我来说不容易),使用awk发送到不同的文件(不可能来自sed)s#\(.*</a>\).*$#\1#
和s/\(<a>.*\)$/\1/