XML文件中的Grep
我必须从XML文件中找到一些模式,但我无法做到这一点XML文件中的Grep,xml,linux,sed,awk,grep,Xml,Linux,Sed,Awk,Grep,我必须从XML文件中找到一些模式,但我无法做到这一点 <field> <uniqueid>account </uniqueod> <tableid>afs</tableid> </field> <field> <uniqueid>address</uniqueod> <tableid>afs</tableid> </field> i、 e.对于每个唯一
<field>
<uniqueid>account
</uniqueod>
<tableid>afs</tableid>
</field>
<field>
<uniqueid>address</uniqueod>
<tableid>afs</tableid>
</field>
i、 e.对于每个唯一标识,应随附打印tableid。
条目可以不同,也可以相同。
伙计们帮帮我…那是因为你不应该用grep来做这个。试试XSLT,或者相反。同意grep(以及其他“标准”文本工具,如awk、sed和friends)不是解决这个问题的最佳方案 然而,类似于您想用awk做的事情是可以做到的:@ignacio是正确的。 但如果你想尝试一些肮脏的黑客行为,这里有一个特定于你的文件:
grep -e "uniqueid" -e "tableid" sample.xml | sed -e 's/<[^>]*>//g' | sed -e '/^$/d' | sed 'N; s/\n/ /'
account afs12
address afs34
grep-e“uniqueid”-e“tableid”sample.xml | sed-e的/]*>///g'| sed-e'/^$/d'| sed'N;s/\n/'
账户afs12
地址afs34
您的文件“sample.xml”带有更正的标记(uniqueod不正确)和一些数据:
<field>
<uniqueid>account
</uniqueid>
<tableid>afs12</tableid>
</field>
<field>
<uniqueid>address</uniqueid>
<tableid>afs34</tableid>
</field>
账户
afs12
住址
afs34
解释:
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
grep-e“uniqueid”-e“tableid”sample.xml->查找标记和数据
sed-e的//]*>//g'->删除标记,只剩下数据
sed-e'/^$/d'->删除因结束标记而产生的任何空行
塞恩;s/\n/'->附加备用行
可能有更好的方法,但我对sed和awk的了解还处于初级水平。这可能适合您:
sed ':a;$!N;/^<uniqueid>/!D;/^<[^>]*>\n*\([^\n<]*\)\n*<[^>]*>\n*<[^>]*>\n*\([^\n<]*\)\n*<[^>]*>/!ba;s//\1 \2\n/;P;D' XML
sed”:a;$!N、 /^/!D、 /^]*>\n*\([^\n\n*]*>\n*\([^\n/!ba;s/\1\2\n/;P;D'XML
标记名不匹配?如果要搜索文件,应该使用XPath。如果要转换文件,应该使用XSLT。“grep”、“sed”和“friends”可能足以实现快速的“n”脏一次性…但如果要做更多的事情,你会很快遇到障碍。IMHO。。。
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 ':a;$!N;/^<uniqueid>/!D;/^<[^>]*>\n*\([^\n<]*\)\n*<[^>]*>\n*<[^>]*>\n*\([^\n<]*\)\n*<[^>]*>/!ba;s//\1 \2\n/;P;D' XML