2011-11-09 6 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

は、以下の試験を参照:出力ライン$ {HOME} /サイト/位置、 上記空のラインは、それがあったこと

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 

メモを空白だったOTHER=

1

これはあなたのために役立つかもしれません:

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

あなたのデータはXMLに簡単に変換できるようです。そこから、XSLTのような標準的なXMLツールを使い、抽出したいものを正確に指定することができます。

この小さなサンプルでは、​​XMLのアプローチはおそらく過剰です。あなたがエスケープされたかっこ、または整形式XMLになるためにエスケープする必要があるものに対処する必要がある場合は、おそらく価値がありません努力。しかし、あなたが堅牢でポータブルであることを望むなら、これは道のりであると言いたいと思います。

あなたのデータはS式のようです。多分S式のためのxsltprocのようなものがありますか?

ここには、テストデータを何らかの擬似XMLに変換するために動作するように見える、簡単なPerlの2つのライナーがあります。私はルートノードを処理しようとはしませんでした。もっと助けが必要な場合はもう一度お尋ねください。

$ 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

yay。私たちはbashが実際には適していないという解析問題を抱えています。今ではXMLを破損したXMLに似たバージョンに変換していますので、XMLをプレーンテキストとして扱うのも脆弱です。私はこれをお勧めしません:これは_adding_複雑さです – sehe

+0

私は必要なすべての警告でこれをヘッジしようとしました。私は、このアプローチが理にかなっている時間/複雑さ/努力/コストスケールのポイントがあることを維持しています。私は、XMLが壊れてはならないと完全に同意します。私は、入力が普通の場合、実際には小さな努力であることを実証したかっただけです。私はそれを修正する方法を提案することができ、OPがこの道を進んでいければ、私はそれをやり遂げて喜んでくれるでしょうが、答えはOPのニーズと好みにもよります。 – tripleee

関連する問題