我有一些简单的XML,如下所示:
<event>
zappo
</event>
<event>
wappo
</event>
我想要一个简单的Bash函数来返回其中一个“event”元素的内容。该函数可以以如下方式使用,其中整数(2)用于指定要返回的元素:
command:
myFunction myFile.txt 2
output:
wappo
我对程序XMLStarlet有点熟悉,但我需要使用Linux上的更多标准工具来完成这项工作。你能指出我正确的方向吗?
答案 0 :(得分:0)
xmlparser将是安全的方式。
如果由于某种原因,您必须使用文本处理工具,awk可以为此工作,但您必须确保文件格式严格遵循您的问题中的格式。
awk -v n="$idx" '/<event>/{++i;p=1;next}/<\/event>/{p=0}p&&i==n{print}' file
你只需要传递$idx
(可能是shell变量),它将为你输出正确的块。例如:
kent$ cat f
<event>
one
</event>
<event>
two
</event>
<event>
three
sss
</event>
<event>
four
</event>
kent$ awk -v n="3" '/<event>/{++i;p=1;next}/<\/event>/{p=0}p&&i==n{print}' f
three
sss
kent$ awk -v n="2" '/<event>/{++i;p=1;next}/<\/event>/{p=0}p&&i==n{print}' f
two
答案 1 :(得分:0)
您可以使用GNU awk
尝试这样的操作,但请记住,awk
和sed
不适用于xml
解析。有专门的工具,这将是这样的工作的理想选择。
使用awk
,您可以执行以下操作:
awk 'NR==2*n' n="2" RS='</?event>' ORS='' xml
$ cat xml
<event>
one
</event>
<event>
two
</event>
<event>
three
sss
</event>
<event>
four
</event>
$ awk 'NR==2*n' n="2" RS='</?event>' ORS='' xml
two
$ awk 'NR==2*n' n="3" RS='</?event>' ORS='' xml
three
sss
$ awk 'NR==2*n' n="4" RS='</?event>' ORS='' xml
four
答案 2 :(得分:0)
在:
perl -0777 -MXML::Simple -nlE '$x=XMLin($_);say $x->{event}->[0]' < file.xml
会打印:
zappo
和
perl -0777 -MXML::Simple -nlE '$x=XMLin($_);say $x->{event}->[1]' < file.xml
打印
wappo
但是你需要有效的xml。您的xml不是有效的XML,只有有效的xml-fragment。因此,如果您的文件与上面的内容完全相同 - 您可以按下一步运行命令:
(echo '<root>';cat file.xml;echo '</root>') | perl -0777 -MXML::Simple -nlE '$x=XMLin($_);say $x->{event}->[0]'
但您需要perl
并安装XML::Simple
模块。