sed/awk - print text zwischen Muster überspannt, die über mehrere Zeilen
Ich bin neu in scripting und versuchte zu lernen, wie zu extrahieren text, der vorhanden ist zwischen zwei verschiedenen mustern. Allerdings bin ich noch nicht in der Lage, herauszufinden, wie Sie zum extrahieren von text zwischen zwei mustern in das folgende Szenario:
Wenn ich mein input-Datei Lesen:
Hi I would like
to print text
between these
patterns
und voraussichtlich meine Ausgabe ist wie:
I would like
to print text
between these
also mein erstes such-Muster "Hi" und überspringen Sie dieses Muster, aber drucken alles, was existiert, in der gleichen Zeile, die Muster abgestimmt. Meine zweite such-Muster "Muster" und ich würde gerne komplett zu vermeiden, drucken Sie diese Zeile oder alle Zeilen, die Sie darüber hinaus.
Ich habe versucht, die folgenden:
sed -n '/Hi/,/patterns/p' test.txt
[output]
Hi I would like
to print text
between these
patterns
Weiter habe ich versucht:
`awk ' /'"Hi"'/{flag=1;next} /'"pattern"'/{flag=0} flag { print }'` test.txt
[output]
to print text
between these
Kann mir jemand helfen bei der Identifizierung, wie Sie diese erreichen?
Vielen Dank im Voraus
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie die richtige Idee, eine mini-state-machine in
awk
aber Sie müssen einige leichte mods wie pro die folgende Niederschrift:Oder in komprimierter form:
Die Ausgabe ist:
als angefordert.
Die Funktionsweise ist wie folgt. Die
echo
variable ist zunächst0
was bedeutet, dass kein echo statt.Jede Zeile wird geprüft, wiederum. Wenn es enthält
patterns
, echo deaktiviert ist.Wenn es enthält
Hi
gefolgt von einem Leerzeichen, echo ist eingeschaltet undgsub
wird verwendet, um die Zeile ändern, um loszuwerden, alles bis auf dieHi
.Dann, unabhängig davon, wie die Zeile (möglicherweise geänderten) zurückgegeben wird, wenn die
echo
Flagge auf.Nun, es geht um Grenzfälle wie:
Hi
; oderpatterns
.Du noch nicht angegeben, wie Sie behandelt werden sollten, also, ich wollte nicht stören, aber die Grundidee sollte die gleiche sein.
Aktualisiert die Lösung entfernen Sie die Zeile "Muster" :
Könnte dies für Sie arbeiten (GNU sed):
Nur ein flag setzen (f) wenn Sie+ersetzen Hallo am Anfang einer Zeile, deaktivieren Sie es, wenn Sie Muster finden, dann rufen Sie das Standard-drucken-wenn das flag gesetzt ist: