2011-11-09 64 views
0

我需要解析具有以下格式化數據的文件,並獲取OTHER節點的 DIRNAME。解析定製的純文本文件

CLASS= 
    (SOURCE= 
     (TYPE=FILE) 
     (DEFAULT= 
      (DIRNAME=${HOME}/information/logs) 
     ) 
    ) 


    OTHER= 
    (SOURCE= 
     (TYPE=FILE) 
     (DEFAULT= 
      (DIRNAME=${HOME}/site/location) 
     ) 
    ) 

    STUDENT= 
    (SOURCE= 
     (TYPE=FILE) 
     (DEFAULT= 
      (DIRNAME=/opt/students) 
     ) 
    ) 

我要捕捉包含在其他=領域的一切,就像 這樣:

OTHER= <whitespace> (<to capture>) 

,然後我不得不抓住一切,是在 其它=領域的DIRNAME內,像這樣:

(DIRNAME=<to capture>) 

我想這樣做是一種可在最 UNIX系統上運行穩健的腳本,任何人都知道我應該使用什麼命令行工具來處理這個 以及我需要使用什麼樣的正則表達式以我所描述的方式捕獲 中的數據。

任何幫助表示讚賞,

特德

+0

weehoo。 Lisp符合Oracle tnsnames。最好的品種:) – sehe

回答

2

看到下面的測試:

kent$ cat t 
    CLASS= 
    (SOURCE= 
     (TYPE=FILE) 
     (DEFAULT= 
      (DIRNAME=${HOME}/information/logs) 
     ) 
    ) 


    OTHER= 
    (SOURCE= 
     (TYPE=FILE) 
     (DEFAULT= 
      (DIRNAME=${HOME}/site/location) 
     ) 
    ) 

    STUDENT= 
    (SOURCE= 
     (TYPE=FILE) 
     (DEFAULT= 
      (DIRNAME=/opt/students) 
     ) 
    ) 

kent$ awk -F= '$1~/OTHER/{i++;print $2} $1~/DIRNAME/ && i{i=0;gsub(/\)$/,"",$2); print $2}' t 

${HOME}/site/location 

注意到,有上述輸出線$ {HOME} /網站/地點, 一個空行它是OTHER=

1

之後的空格這可能適用於您:

sed -ne '/OTHER/,/DIRNAME/{s/^[^D]*DIRNAME=\(.*\))/\1/p}' input_file 
${HOME}/site/location 
0

您的數據看起來像是很容易翻譯成XML。從那裏,您可以輕鬆使用標準XML工具(如XSLT)來準確指定要提取的內容。

對於這個小樣本,XML方法可能是矯枉過正的,如果您需要應對逃避的括號或需要轉義的東西以形成格式良好的XML,可能不值得努力。但如果你想要健壯和便攜,我會說這是要走的路。

對於什麼是值得的,你的數據看起來像S表達式; S表達式可能有類似xsltproc

下面是一個簡短的Perl雙線程,它似乎適用於將測試數據轉換爲某種僞XML。我沒有試圖處理根節點;再次詢問是否需要更多幫助。

$ perl -pe 's{\(([^\s=]+)=|\)}{ if (defined $1) { push @tags, $1; "<$1>" } 
> else { sprintf("</%s>", pop @tags) } }ge' /tmp/data 
CLASS= 
<SOURCE> 
    <TYPE>FILE</TYPE> 
    <DEFAULT> 
     <DIRNAME>${HOME}/information/logs</DIRNAME> 
    </DEFAULT> 
    </SOURCE> 


OTHER= 
<SOURCE> 
    <TYPE>FILE</TYPE> 
    <DEFAULT> 
     <DIRNAME>${HOME}/site/location</DIRNAME> 
    </DEFAULT> 
    </SOURCE> 

STUDENT= 
<SOURCE> 
    <TYPE>FILE</TYPE> 
    <DEFAULT> 
     <DIRNAME>/opt/students</DIRNAME> 
    </DEFAULT> 
    </SOURCE> 
+0

耶。我們有一個解析問題,bash並不適合,現在我們已經將它轉換爲一個類似破碎的XML的版本,因此我們可以將XML作爲明文處理的脆弱性。我不會推薦這個:這是_adding_複雜性 – sehe

+0

我試圖用所有必要的警告來對衝這個問題;我認爲,在這種方法有意義的時候/複雜性/努力/成本範圍上有一些要點。我完全同意XML不應該被破壞;我只是想證明,如果投入是正常的,那確實是一個小小的努力。我可以建議如何解決這個問題,如果OP想要走下去,我會很樂意這樣做,但答案也取決於OP的需求和偏好。 – tripleee