2014-09-22 79 views
0

推斷我有一個實用工具,可以大量的XML標籤內解析的屬性,如非貪婪的文本匹配,並在bash

<mytag name="value" name="value"../> 

我已經寫在Perl程序。它採用基本非貪婪文本匹配,就像這樣:

while(<XML>) 
{ 
    if (/name=\"(.+?)\"/) 
    { 
     print("Value is: $1\n"); 
    } 

我知道我要提取的名稱/值對的名字,所以我硬編碼到他們的效用。
這對我來說工作得很好......我該如何在bash中做到這一點?我嘗試過使用awk,但它不起作用,因爲我有像name="value with spaces in the middle"這樣的屬性。
使用awk,我需要知道我想提取的名稱/值對的索引 - 例如我的第三組的awk { print $3 }。如果這些值在中間沒有空格,這可以正常工作,但如果它們這樣做了,它就會失敗,並且只有給出值纔會出現空格字符。

任何東西都會有幫助,謝謝。

+2

這就是爲什麼我們建議使用XML解析器來解析XML。 – 2014-09-22 19:12:15

+0

確實。如果您正在解析'xmlstarlet pyx'的輸出,那麼您可以更輕鬆地正確處理,因爲它將XML轉換爲面向行的格式,以便使用傳統的文本管理工具進行輕鬆解析。 – 2014-09-22 23:39:14

回答

1

在簡單的情況下,避免使用非貪婪匹配(在許多標準實用程序中不可用,例如sed,awkgrep)很容易。

例如,「常規」表達式(與非貪婪匹配):

name=\"(.+?)\" 

是完全一樣的普通的正則表達式

name=\"([^"]+)\" 

雖然有可能是你真正想要的是:

name=\"([^"]*)\" 

這並不是那麼容易,如果終止內部重複模式不是一個單一的字符,但總是有一個正則表達式可以工作。例如,C風格的註釋可以與非貪婪匹配識別:

/[*].*?[*]/ 

和正則表達式

/[*][^*]*[*]+([^*/][^*]*[*]+)*/ 

這是一個有點難以閱讀,但應該只是罰款。 (我更喜歡[*]\*但他們都做同樣的事情。)