Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML文件中的Grep_Xml_Linux_Sed_Awk_Grep - Fatal编程技术网

XML文件中的Grep

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.对于每个唯一

我必须从XML文件中找到一些模式,但我无法做到这一点

<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