sed / awk - Drucken Sie Text zwischen Mustern, die sich über mehrere Zeilen erstrecken

8

Ich bin neu im Scripting und habe versucht zu lernen, wie man Text, der zwischen zwei verschiedenen Mustern existiert, extrahiert. Allerdings kann ich im folgenden Szenario noch nicht herausfinden, wie man Text zwischen zwei Mustern extrahiert:

Wenn ich meine Eingabedatei gelesen habe:

%Vor%

und meine erwartete Ausgabe ist wie folgt:

%Vor%

d. Mein erstes Suchmuster ist "Hallo" und überspringe dieses Muster, aber drucke alles, was in der gleichen Zeile nach diesem übereinstimmenden Muster existiert. Mein zweites Suchmuster ist "Muster" und ich möchte vollständig vermeiden, diese Zeile oder irgendwelche Zeilen darüber hinaus zu drucken .

Ich habe Folgendes versucht:

%Vor%

[Ausgabe]

%Vor%

Als nächstes habe ich versucht:

%Vor%

[Ausgabe]

%Vor%

Kann mir jemand helfen, herauszufinden, wie ich das erreichen kann? Vielen Dank im Voraus

    
Amarnath Revanna 23.10.2012, 04:30
quelle

4 Antworten

6

Du hast die richtige Idee, eine Mini-Zustandsmaschine in awk , aber du brauchst ein paar kleine Mods wie in der folgenden Abschrift:

%Vor%

Oder in komprimierter Form:

%Vor%

Die Ausgabe davon ist:

%Vor%

wie angefordert.

So funktioniert das. Die Variable echo ist anfangs 0 , was bedeutet, dass kein Echo stattfinden wird.

Jede Zeile wird nacheinander überprüft. Wenn es patterns enthält, ist das Echo deaktiviert.

Wenn es Hi gefolgt von einem Leerzeichen enthält, wird echo eingeschaltet und gsub wird verwendet, um die Zeile zu modifizieren, um alles bis auf Hi loszuwerden.

Dann wird die Zeile (möglicherweise modifiziert) trotzdem wiederholt, wenn das Flag echo aktiviert ist.

Nun wird es Kantenfälle wie:

geben
  • Zeilen mit zwei Vorkommen von Hi ; oder
  • Zeilen mit etwas vor patterns .

Sie haben nicht angegeben, wie sie behandelt werden sollen, also habe ich mich nicht darum gekümmert, aber das Grundkonzept sollte das gleiche sein.

    
paxdiablo 23.10.2012, 04:37
quelle
3

Die Lösung wurde aktualisiert, um die Zeile "patterns" zu entfernen:

%Vor%     
Guru 23.10.2012 04:36
quelle
2

Dies könnte für Sie funktionieren (GNU sed):

%Vor%     
potong 23.10.2012 07:00
quelle
1

Setzen Sie einfach ein Flag (f), wenn Sie + Hi am Anfang einer Zeile finden, löschen Sie es, wenn Sie Muster finden, und rufen Sie das Standarddrucken auf, wenn das Flag gesetzt ist:

%Vor%     
Ed Morton 23.10.2012 18:11
quelle

Tags und Links