2013-05-16 26 views
0

我已经把自己陷入了一个有趣的(至少对我而言)问题。让我们看一个XML文件:用bash解析XML对

<a>pair1a</a> 
<b>pair1b</b> 
<c>randomtext</c> 
<a>pair2a</a> 
<b>pair2b</b> 
... 

<b>标签后<a>标签云始终。我想得到的是<a><b>之间的内容保存并关联在一起。我应该如何在bash中解决这个问题,以便以后我可以轻松访问和管理数据?我想过关联数组或将所有内容放在一个数组中,并使用某种分隔符将内容从b中分离出来(尽管这可能很棘手)。我的方法相当简单,因为将所有内容都写入两个数组,然后让它们使用单​​个索引(顺便说一句,我习惯了perl正则表达式,这就是grep使用的)。这可以做到简单吗?

a_Array=$(curl --silent -L $xml | grep -oP '(?<=<a>).*?(?=</a>)') 
b_Array=$(curl --silent -L $xml | grep -oP '(?<=<b>).*?(?=</b>)') 
+0

你试过'xml_grep'吗? – esauvisky

+0

我知道这样的工具,但不知道它是否会改变代码结构,是吗? – shookees

+0

没关系,我误解了你的问题。这是一个很奇怪的xml btw。你的代码有什么问题? – esauvisky

回答

1

XML无法用shell方式正确解析。有关于此主题的very nice text

这样说的话,规则可能会有例外。首先,如果你的输入不是任意的XML,但特定格式的XML,您可能能够使用grep

在您的例子我猜元素<a>...</a><b>...</b>每个从来没有属性,每个属性解析它在空时不会缩写为<a/>,每个跨度只有一行,并且总是遵循对方。此外,我想我们可以假设没有[CDATA[...]]或类似的东西会出现在您的XML中,其中可能有东西看起来像你的元素。最后,我们假设你输入的内容没有空格(像< a >)。

如果这一切都属于这种情况,那么只需要grep '^<a>''^<b>',是的。你也可能会发现grep的选项-A-B有用的,例如在:

cat my.xml | grep -A 1 '^<a>' 

这将打印起始<a>和所有行每行下面这样的一条线。可以使用-B在匹配正则表达式之前包含行。