2016-06-11 55 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

相关问题