Ein Perl-Ansatz:
$ perl -F"" -a00ne 'for (@F){$i++ if /{/; $i||print; $i-- if /}/}' file
This is
that wants
anyway
Erläuterung
-a
: Aktiviert die automatische Aufteilung des von -F
in das @F
Array angegebenen Dateibegrenzers .
-F""
: setzt das Eingabefeldtrennzeichen auf leer, was dazu führt, dass jedes Element @F
eines der Eingabezeichen ist.
-00
: Aktivieren Sie den "Absatzmodus", in dem eine "Zeile" als zwei aufeinanderfolgende Zeilenumbrüche definiert ist. Dies bedeutet, dass in diesem Fall die gesamte Datei als einzelne Zeile behandelt wird. Wenn Ihre Datei viele Absätze enthalten kann und die Klammern mehrere Absätze umfassen können, verwenden Sie -0777
stattdessen.
-ne
: Lesen Sie eine Eingabedatei und wenden Sie das angegebene Skript -e
auf jede Zeile an.
Das Skript selbst ist eigentlich recht einfach. Ein Zähler wird jedes Mal, wenn a {
gesehen wird, um eins erhöht und für jeden um eins dekrementiert }
. Das heißt, wenn der Zähler 0 ist, befinden wir uns nicht in Klammern und sollten drucken:
for (@F){}
: Tun Sie dies für jedes Element von @F
, jedes Zeichen in der Zeile.
$i++ if /{/;
: $i
um eins erhöhen, wenn dieses Zeichen a ist{
$i||print;
: Drucken, sofern nicht $i
gesetzt (0 gilt als nicht gesetzt).
$i-- if /}/
: Dekrementiere $i
um eins, wenn dieses Zeichen a ist}