2016-06-22 9 views
2

のように私は、いくつかの文字列や変数を含むファイルを、持っている:私は「{}」の間のすべての文字列を印刷したいsedの印刷複数のマッチ

${cat.mouse.dog} 
bird://localhost:${xfire.port}/${plfservice.url} 
bird://localhost:${xfire.port}/${spkservice.synch.url} 
bird://localhost:${xfire.port}/${spkservice.asynch.request.url} 
${soabp.protocol}://${hpc.reward113.host}:${hpc.reward113.port} 
${configtool.store.folder}/config/hpctemplates.htb 

。いくつかの行には、そのような文字列が複数あり、この場合、同じ行にとどまるべきです。出力は次のようになります。

sed -n 's/.*{//;s/}.*//p' filename 

が、それは、各行の最後の発生を印刷:

cat.mouse.dog 
xfire.port plfservice.url 
xfire.port spkservice.synch.url 
xfire.port spkservice.asynch.request.url 
soabp.protocol hpc.reward113.host hpc.reward113.port 
configtool.store.folder 

Iは、以下を試してみました。元のファイルと同じ行に残っているすべてのオカレンスを取得するにはどうすればよいですか?

答えて

1

あなたがawk反対していない場合は、次の手順を試すことができます。

awk -v RS='{|}' -v ORS=' ' '/\n/{printf "\n"} (NR+1)%2' file 

レコードセパレータRS{または}のいずれかに設定されています。これは、残りのパターンから必要なパターンを分割します。

スクリプトは、(NR+1)%2というステートメントで2のうち1レコードを表示します。

アラインメントを期待どおりに保つために、出力レコード区切り文字はスペースORS=' 'に設定され、改行が発生するたびに/\n/{printf "\n"}が挿入されます。

+0

ありがとうございました。これはまさに私が必要としていたものです。 :-) awkは完璧です。私は2日間の解決策を見つけることができなかったので、私は非常に感謝しています。 – azilinha

+0

今、私は同じファイルのすべての変数のスクリプトを実行したいと思います。スクリプトが完了し、変数を解決して値を取得します。スクリプトresolve.shを呼び出しましょう。 私はファイルを調べたいところですが、 "{}"の間に文字列がある場合は、スクリプトを実行させてください。何かのような catファイル| awk -v RS = '{|}' -v ORS = '' '/ \ n/{printf "\ n"}(NR + 1)%2 "; resolve.sh $ iを実行します。 done 私の "解決策"は、変数の解決された値だけを与えるため、間違っています。それぞれが分離された行です。私は元のファイルを持っていますが、変数があるところではresolve.shを実行させてください。 – azilinha

+0

私がよく理解していて、すべてのパターンをループしたいなら、これを使うことができます: 'for i in $(awk -v RS = '{|}' -v ORS = '' '(NR + 1)%2 'テスト); resolve.sh $ iを実行します。 done' – oliv

2

これは(GNUのSED)あなたのために働くかもしれない:

sed -n 's/${/\n/g;T;s/[^\n]*\n\([^}]*\)}[^\n]*/\1 /g;s/ $//p' file 

改行ですべて${を交換し、非がある場合に処理するためには何もないとして、その後に移動します。改行がある場合は、改行以外の文字を左に、改行以外の文字は次の}の右に削除します。最後に、グローバル置換のRHSに導入された余分なスペースを削除します。

+0

これは上記のawkソリューションと同じように完璧です。両方に感謝します。 – azilinha