2012-04-02 60 views
0

我必须从XML文件中找到一些模式,但我无法做到。XML文件中的Grep

<field> 
<uniqueid>account 
</uniqueod> 
<tableid>afs</tableid> 
</field> 
<field> 
<uniqueid>address</uniqueod> 
<tableid>afs</tableid> 
</field> 

什么,我要做的就是寻找这两个领域之间的条目,并将其重定向到一个file.txt.and输出应该是这样的,

uniqueid tableid 
uniqueid tableid 

即每个UNIQUEID TABLEID应与它一起印刷。 条目可以不同或相同。 伙计们帮我...

+0

''标签名称不匹配? – kev 2012-04-02 05:30:19

+0

[RegEx match open tags but XHTML self-contained tags]可能重复(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – jrturton 2012-04-02 09:14:26

回答

5

这是因为你不应该使用grep这个。改为尝试使用XSLT或XMLStarlet

+0

如果你想要搜索文件,您应该使用XPath。如果你想转换文件,你应该使用XSLT。 “grep”,“sed”和朋友可能对于quick'n'drty一次性......足够好了,但对于其他任何事情,你都会快速地撞墙。恕我直言... – paulsm4 2012-04-02 05:34:23

3
$ xmlstarlet sel -t -m '//field' -v 'concat(normalize-space(uniqueid), " ", normalize-space(tableid))' -n input.xml 
account afs 
address afs 
0

@ignacio是正确的。 但还是如果你想尝试一些脏hacks.Here是一个特定的文件:

grep -e "uniqueid" -e "tableid" sample.xml | sed -e 's/<[^>]*>//g' | sed -e '/^$/d' | sed 'N; s/\n/ /' 

account afs12 
address afs34 

你的文件“sample.xml中”与修正标签(uniqueod是不正确的)和一些数据:

<field> 
<uniqueid>account 
</uniqueid> 
<tableid>afs12</tableid> 
</field> 
<field> 
<uniqueid>address</uniqueid> 
<tableid>afs34</tableid> 
</field> 

解释:

grep -e "uniqueid" -e "tableid" sample.xml -> find the tags and data 
sed -e 's/<[^>]*>//g'    -> remove the tags,only data remains 
sed -e '/^$/d'     -> remove any empty line i.e. which came due to closing tags 
sed 'N; s/\n/ /'     -> append alternate lines 

可能有更好的方法,但我的sed和awk知识,是初学者的水平。

0

这可能会为你工作:

sed ':a;$!N;/^<uniqueid>/!D;/^<[^>]*>\n*\([^\n<]*\)\n*<[^>]*>\n*<[^>]*>\n*\([^\n<]*\)\n*<[^>]*>/!ba;s//\1 \2\n/;P;D' XML