2013-05-16 41 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在匹配正則表達式之前包含行。