2016-06-11 7 views
1

Ich habe eine Datei mit einem Dschungel von Strings. Nur wenige Zeilen wie folgt lauten:wie bestimmte Zeichenfolge mit Sonderzeichen aus jeder Zeile einer Datei zu extrahieren

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] + ... 

ich verschiedene einzigartige Kombination von

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

kommen in jeder Zeile finden möchten. Daher muss ich auch nach Zeichenketten suchen, die Sonderzeichen enthalten. Gibt es eine Möglichkeit in der Shell zu tun?

Antwort

2

Sie können diese Gnu awk mit RS benutzerdefinierten verwenden:

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] 

Regex H\\[[^]]*\\] wird jede Instanz von H[...] als Datensatz-Trenn gesetzt.

+0

Hallo @anubhava .. danke .Es funktioniert aus der Box. Aber gibt es eine Möglichkeit, es in bash als irgendeine Funktion für eine allgemeine Zeichenfolge (wie "H" hier) zu setzen. So etwas wie Funktionstest() {awk -v RS = "$ @ \\ [[^]] * \\" "RT &&! Gesehen [RT] ++ {Print RT} '$ @;} –

+0

Entschuldigung Ich habe es nicht zur Arbeit gebracht. Ist es möglich, Ihre Antwort in bashrc zu setzen, so dass ich es für jede Zeichenfolge und Datei verwenden kann. Ich habe versucht, etwas wie Funktion myfunc() {awk -v RS = 'H \\ [[^]] * \\]' 'RT & &!! Gesehen [RT] ++ {print RT}' $ @;} So laufe ich als: myfunc Datei und es gibt das korrekte Ergebnis. Aber ich möchte die Eingabeaufforderung für "H" auch geben, so dass es für jede allgemeine Zeichenfolge verwendet werden kann. –

+1

Innerhalb '.bashrc' haben eine Funktion wie folgt:' myfunc() {awk -v RS = "$ 1" '\\ [[^]] * \\]' 'RT &&! Gesehen [RT] ++ {print RT} '; } 'dann nenne es' cat file | myfunc 'H'' – anubhava

Verwandte Themen