2016-06-11 54 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[*,*,*,*] 

不同的獨特組合中的每一行的到來。因此我也必須搜索包含特殊字符的字符串。有什麼辦法可以在shell中執行?

回答

2

您可以使用此GNU awk命令定製RS

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 ..謝謝。它開箱即用。但有沒有辦法把它放在bash中作爲任何一般字符串的一些函數(比如這裏的「H」)。 類似 function test(){awk -v RS =「$ @ \\ [[^]] * \\]」'RT &&!seen [RT] ++ {print RT}'$ @;} –

+0

對不起,我沒有得到它的工作。 是否有可能把你的答案放入bashrc中,以便我可以將它用於任何字符串和文件。我試過類似 函數myfunc(){awk -v RS ='H \\ [[^]] * \\'''RT &&!seen [RT] ++ {print RT}'$ @;} 所以我運行爲:myfunc文件,它會給出正確的結果。但我也想爲「H」提供快速輸入,以便它可以用於任何常規字符串。 –

+1

'.bashrc'裏面有這樣一個函數:'myfunc(){awk -v RS =「$ 1」'\\ [[^]] * \\]''RT &&!seen [RT] ++ {print RT}'; }'然後把它稱爲'cat file | myfunc'H'' – anubhava

相關問題