2016-06-11 20 views
1

私は文字列のジャングルを持つファイルを持っています。次のように数行を読む:ファイルの各行から特殊文字を含む特定の文字列を抽出する方法

2*H[0, 3, y]*Log[1 - z] - 2*H[2, 3, y]*Log[1 - z] + 
6*H[2, 2, 0, y] + 6*H[2, 2, 2, y] - 48*Log[-Q2] + 12*zeta2*Log[-Q2] + 
(-107 + 12*N^2*(-1 + N^2))*z^2))*(H[0, 1, 0, y] + H[0, 1, 0, z] + ... 

は、私はそれぞれの行に来て

H[*,*,*] or H[*,*,*,*] 

の異なるユニークな組み合わせを見つけたいです。したがって、特殊文字を含む文字列も検索する必要があります。シェルで行う方法はありますか?

答えて

2

カスタムRSでこれGNU awkコマンドを使用することができます。

awk -v RS='H\\[[^]]*\\]' 'RT && !seen[RT]++{print RT}' file 

H[0, 3, y] 
H[2, 3, y] 
H[2, 2, 0, y] 
H[2, 2, 2, y] 
H[0, 1, 0, y] 
H[0, 1, 0, z] 

正規表現H\\[[^]]*\\]がレコードセパレータとしてH[...]の各インスタンスを設定します。

+0

こんにちは@anubhava ..ありがとう。それは箱の中で働く。しかし、一般的な文字列(ここでは "H"など)のための関数としてbashに入れる方法はありますか? 何かのように function test(){awk -v RS = "$ @ \\ [[^]] * \\]" 'RT &&!見られました[RT] ++ {print RT}' $ @;} –

+0

残念です私はそれを働かせることはできませんでした。 あなたの答えをbashrcに入れることができるので、私はそれをどんな文字列やファイルにも使うことができます。 私は何かを試しました 関数myfunc(){awk -v RS = 'H \\ [[^]] * \\]' 'RT &&!見た[RT] ++ {print RT}' $ @;} だから私は:myfuncファイルとして実行し、正しい結果を返します。しかし、私は "H"のためのプロンプト入力も与えたいので、一般的な文字列に使うことができます。 –

+1

'.bashrc'の中に' myfunc(){awk -v RS = "$ 1" '\\ [[^]] * \\]' 'RT &&!seen [RT] ++ {print RT} '; } 'それを' catファイル| myfunc 'H'' – anubhava

関連する問題