使用sed(或其他一些标准工具)解析标签序列的简单XML

时间:2013-07-23 15:29:35

标签: xml bash parsing sed

我有一些简单的XML,如下所示:

<event>
    zappo
</event>
<event>
    wappo
</event>

我想要一个简单的Bash函数来返回其中一个“event”元素的内容。该函数可以以如下方式使用,其中整数(2)用于指定要返回的元素:

command:
    myFunction myFile.txt 2
output:
    wappo

我对程序XMLStarlet有点熟悉,但我需要使用Linux上的更多标准工具来完成这项工作。你能指出我正确的方向吗?

3 个答案:

答案 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尝试这样的操作,但请记住,awksed不适用于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模块。