1

我有一些简单的 XML,格式如下:

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

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

command:
    myFunction myFile.txt 2
output:
    wappo

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

4

3 回答 3

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
于 2013-07-23T15:47:19.647 回答
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
于 2013-07-23T16:03:24.240 回答
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 片段。所以,如果你的文件真的像上面那样 - 你可以运行下面的命令:

(echo '<root>';cat file.xml;echo '</root>') | perl -0777 -MXML::Simple -nlE '$x=XMLin($_);say $x->{event}->[0]'

但是您需要拥有perl并安装该XML::Simple模块。

于 2013-07-23T16:17:14.847 回答