Beispiel:
This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.
Soll werden:
This is
that wants
anyway.
Ich habe einige ähnliche Themen im Forum gefunden, aber sie scheinen nicht mit mehrzeiligen geschweiften Klammern zu funktionieren.
Wenn möglich, würde ich eine einzeilige Methode bevorzugen, wie Lösungen, die auf grep, sed, awk ... usw. basieren.
BEARBEITEN: Lösungen scheinen in Ordnung zu sein, aber ich habe festgestellt, dass meine Originaldateien verschachtelte Klammern enthalten. Also öffne ich eine neue Frage. Vielen Dank an alle: Wie kann ich den gesamten Text zwischen verschachtelten geschweiften Klammern in einer mehrzeiligen Textdatei löschen?
text-processing
sed
awk
grep
Sopalajo de Arrierez
quelle
quelle
sed '/{/{:1;N;s/{.*}//;T1}' multiline.file
Antworten:
Erläuterung:
:again;$!N;$!b again;
Dadurch wird die gesamte Datei in den Musterbereich eingelesen.
:again
ist ein Etikett.N
liest in der nächsten Zeile.$!b again
verzweigt zurück zumagain
Etikett, sofern dies nicht die letzte Zeile ist.s/{[^}]*}//g
Dadurch werden alle Ausdrücke in geschweiften Klammern entfernt.
Versuchen Sie unter Mac OSX:
Verschachtelte Klammern
Nehmen wir dies als Testdatei mit vielen verschachtelten Klammern:
Hier ist eine Modifikation für verschachtelte Klammern:
Erläuterung:
:again;$!N;$!b again
Dies ist das gleiche wie zuvor: Es liest die gesamte Datei ein.
:b
Dies definiert eine Beschriftung
b
.s/{[^{}]*}//g
Dadurch wird Text in geschweiften Klammern entfernt, solange der Text keine inneren Klammern enthält.
t b
Wenn der obige Ersatzbefehl zu einer Änderung geführt hat, kehren Sie zur Bezeichnung zurück
b
. Auf diese Weise wird der Ersatzbefehl wiederholt, bis alle Klammergruppen entfernt sind.quelle
EDIT
), nicht genau dieselbe ist, sollten Sie sie auch beantworten. Wäre es in Ordnung mit den Forumregeln?Perl:
Wenn Sie direkt bearbeiten möchten
Dadurch wird die Datei als einzelne Zeichenfolge gelesen und global gesucht und ersetzt.
Dies behandelt verschachtelte Klammern:
quelle
Sed:
seit Zeile mit gestartet
{
und die nächste Zeile (N
) abrufen, bis Substitution ({}
) vorgenommen werden kann (T
bedeutet Rückkehr zur Markierung von,:
wenn keine Ersetzung vorgenommen wurde)Ein wenig modifizieren, um wahr zu sein, wenn viele Locken in einer Linie geklammert sind
Entfernen Sie alle Symbole in den Klammern (
[^}]
entspricht jedem Symbol,right bracket
außer umsed
nicht gierig zu werden), und wenn in der Zeile verbleibenleft bracked
, beginnen Sie mit der nächsten hinzugefügten Zeile, wenn dies nicht der Fall istright bracket
.quelle