0

我遇到了一个有趣的(至少对我而言)问题。让我们拿一个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>)')
4

1 回答 1

1

无法使用 shell 方法正确解析 XML。关于这个主题有一个非常好的文本。

话虽如此,该规则可能存在例外情况。一方面,如果您的输入不是任意 XML 而是特定格式的 XML,您可以使用grepetc来解析它。

在您的示例中,我猜元素<a>...</a>并且<b>...</b>每个元素都没有属性,每个元素都不会缩写为<a/>空时,每个元素恰好跨越一行并且始终相互跟随。此外,我想我们可以假设[CDATA[...]]您的 XML 中不会出现或类似的东西,而这些东西又可能看起来像您的元素。最后,我们假设您的输入中没有空格丑陋(sth like < a >)。

如果所有这些都是这种情况,您只需 grep'^<a>''^<b>',是的。您还可能会发现grep's 选项很有用-A-B例如:

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

这将打印以该行开头的所有行<a>以及该行之后的每一行。 -B可用于在匹配正则表达式的行之前包含行。

于 2013-05-16T14:57:37.637 回答