2017-07-27 3 views
0

Benötigen Sie Hilfe zu einem Teil des Bash-Skripts und es muss eine bestimmte Musterzeichenfolge finden. Eine Probe Zeichenfolge ist unten angegeben:Suche nach Kombination und Muster von Strings

//*----------- 
//* %%SET %%ABC  = %%BLANK 
//* %%SET %%RESTART = %%BLANK7 
//* %%SET %%DANGO= 236985 
//*----------- 
//* %%IF %%ODATE EQ 123456 
//* %%SET %%ABC= GSG34 
//* %%SET %%RESTART = RESTART 
//* %%ENDIF 
//*----------- 
//* %%IF %%ODATE EQ 463123 
//* %%SET %%DANGO= 236985 
//* %%ENDIF 
//*----------- 
//* %%IF %%ODATE EQ 15641 
//* %%SET %%RESTART = %%BLANK7 
//* %%ENDIF 
//*----------- 
  • Ich brauche die Kombination von Odate, ABC, NEUSTART innerhalb eines IF und ENDIF Zustand finden
  • I specificly beween IF und ENDIF überprüfen müssen. Außerdem sollte es auf eine Bedingung prüfen, dass die drei Parameter ODATE, ABC und RESTART zwischen IF und ENDIF existieren. Wenn die Bedingung erfüllt ist, sollte sie gedruckt werden.
  • habe ich versucht, die

cat Datei unter Befehle | sed -n '/ %% IF /,/%% ENDIF/p'

//* %%IF %%ODATE EQ 123456 
//* %%SET %%ABC= GSG34 
//* %%SET %%RESTART = RESTART 
//* %%ENDIF 
//* %%IF %%ODATE EQ 463123 
//* %%SET %%DANGO = 236985 
//* %%ENDIF 
//* %%IF %%ODATE EQ 15641 
//* %%SET %%RESTART = %%BLANK7 
//* %%ENDIF 

Ich brauche nur unten zu finden:

//* %%IF %%ODATE EQ 123456 
//* %%SET %%ABC= GSG34 
//* %%SET %%RESTART = RESTART 
//* %%ENDIF 

Wie würde ich in der Lage sein, dies zu tun?

Antwort

0

Mit sed:

sed -n '/%%IF /{:a;N;/%%ENDIF/!ba;/ODATE/{/ABC/{/RESTART/p;}}}' file 
0

Sie können die folgenden awk Befehl verwenden:

awk '/%%ODATE EQ 123456/{p=1}/ENDIF/&&p{p=0;print}p' file 

Ausgang:

//* %%IF %%ODATE EQ 123456 
//* %%SET %%ABC= GSG34 
//* %%SET %%RESTART = RESTART 
//* %%ENDIF 

Grundsätzlich awk druckt eine hier Linie, wenn die Variable p wahr ist. wird gesetzt, wenn die Zeile ODATE EQ 123456 erscheint und auf die nächste ENDIF zurückgesetzt wird. Die ENDIF selbst wird ebenfalls gedruckt.


Nach Ihren Kommentar unten, können Sie diesen Befehl verwenden:

awk '/IF/&&/ABC/&&/RESTART/' RS='\n//\\*---+\n' 

Der Schlüssel hier ist die voneinander zu trennen sindRS.

+0

Vielen Dank für die schnelle Antwort. Aber anstatt von der ODATE-Nummer herausgefiltert zu werden, können wir spezifisch zwischen IF und ENDIF überprüfen. Außerdem sollte es auf eine Bedingung prüfen, dass die drei Parameter ODATE, ABC und RESTART zwischen IF und ENDIF existieren. –

+0

Sie können den folgenden Befehl 'awk 'verwenden/IF/&&/ABC/&&/RESTART /' RS = '// \\ * --- + \ n'' – hek2mgl

+0

Vielen Dank. Das hat die Magie gemacht. –

Verwandte Themen