2012-07-11 68 views
0

我需要爲包含在XML文件中的數據grep。我需要獲取多個元素,最後一個元素位於節點內。我正在琢磨的元素之間有一堆數據。我可以很容易地用grep的多個元素,像這樣:如何grep多個字符串與-A

grep -E "<first|<second|<third|<seventh" file.xml 

但因爲我有一個文件結構,看起來像這樣:

<first>First</first> 
<second>Second</second> 
<third>Third</third> 
<fourth>Fourth</fourth> 
<fifth>Fifth</fifth> 
<sixth flexible="true"> 
    <low>0.09</low> 
    <high>5.90</high> 
</sixth> 
<seventh flexible="false"> 
    <low>1.82</low> 
    <high>3.14</high> 
</seventh> 

我沒有得到<seventh>節點內的數字數據(沒有想到用那個命令)。所以我想用grep -An(後)開關,其中「n」是行最初的比賽後,比賽的數量,以獲得第七節點的其餘部分:

grep -E "<first" -E "<second" -E "<third" -E -A3 "<seventh" file.xml 

這將返回:

<first>First</first> 
<second>Second</second> 
<third>Third</third> 
<seventh flexible="false"> 
    <low>1.82</low> 
    <high>3.14</high> 
</seventh> 

,我可以再按摩,讓我的最終結果(實際上只有連同它相關的第一,第二,第三&字符串從第七節點所需要的「高」的數據)。但是,這不起作用,我會在<first之後立即得到前三個元素,並忽略命令的其餘部分。

我也試過:

grep -E "<first|<second|<third" -E -A3 "<seventh" file.xml 

這給了我幾分相似的結果,但完全忽略了命令的「-E -A3 "<seventh」的一部分。那麼,我猜不要忽略,因爲-A3仍然被應用於命令的前面部分。我知道你可以使用後置命令交換機,但是你能控制它們走多遠嗎?

我閱讀了關於grep的手冊頁,並沒有看到如何將命令鏈接在一起。如果這很重要,我正在使用Mac,但如果需要的話,可以輕鬆訪問Linux操作系統&。

如何獲取我想要的數據?

回答

1

首先,請再次查看man grep,看到多個-E不是必需的,並且grep預計不會出現多種模式。

第二,如果你知道你需要爲seventh而不是其他情況下,只需使用兩個命令:

$ grep -E '<first|<second|<third' file.xml; grep -A3 '<seventh' file.xml 
<first>First</first> 
<second>Second</second> 
<third>Third</third> 
<seventh flexible="false"> 
    <low>1.82</low> 
    <high>3.14</high> 
</seventh> 

如果你真的不知道,那麼這將是更好地使用xpath或其他XML解析工具。請參閱this question

+0

感謝您的幫助,但是您的解決方案無法爲我提供我正在查找的數據。您和邁克爾對xpath的建議看起來是解決問題的好方法。實際上,我做了一個蠻力的grep&sed腳本來讓數據進入可管理的狀態。像這樣: 'grep -E -A3「<第一|第二|第三|第七」file.xml | sed -e's/ //'-e's/ //'-e's/ //'-e's/^ [ \ t] * //'-e'/^.*$/ s''因爲我在每個搜索詞後面都有3行,所以我得到了太多的數據並使用sed來清理它。這很好,所以我可以繼續前進。 – delliottg 2012-07-13 16:46:28

0

不要使用正則表達式來搜索XML。他們不是爲這項工作設計的。你的代碼將是錯誤的。例如,如果某些字符串出現在註釋或CDATA部分中,或者輸入包含名爲<firstly>的元素,或者換行符的排列方式不同,則@Levitsky給出的代碼將失敗。 (有時代碼是錯誤的,在99%的時間內工作並不重要,但如果這是你的要求,我希望你這麼說)。

搜索XML的方法是使用XPath,或者更精細的搜索XQuery。

您的需求的XPath解決方案非常簡單。假設您給出的XML位於wrapper元素內,則XPath 2.0表達式爲wrapper/(first, second, third, seventh)。所以這個任務的XPath不僅更可靠,而且更容易。

+0

感謝您的幫助。 Xpath非常可行,但由於我沒有使用XML解析器,與真實的XML相比,我使用的XML示例過於簡化。我昨天進行了實驗並得出了真正的XML結果,但我只能得到序列化的數據(EG所有節點數據,其後是所有節點數據等),而不是關聯數據: '代碼首先 <第七彈性= 「假」> 1.82 3.14 ' 使用逗號給了我一個 「無效的標記:」 標記錯誤。 – delliottg 2012-07-13 16:35:56