So ersetzen Sie mehrere Zeilen zwischen Trennzeichen

So ersetzen Sie mehrere Zeilen zwischen Trennzeichen

Gegeben sei das Textbeispiel:

.... Text,..
{{{Python
Zeichenfolge1 = "abcde"
Zeichenfolge2 = "12345"
drucken(Zeichenfolge1[[1:3]])
drucken(Zeichenfolge2[[:-1]])
}}}
.... Text,..

Das [[und ]]erscheint auch außerhalb von {{{. Möglicherweise stehen vor {{{ und }}} Leerzeichen und Tabulatoren.

Ich möchte alle [[und ]]in [und ]zwischen {{{und ersetzen }}}.

Ich muss das Ergebnis in die Originaldatei zurückschreiben.

Wie kann ich das machen? Wille sedoder awkArbeit?

Antwort1

Das könnte für Sie funktionieren:

sed -i '/\s*{{{/,/\s*}}}$/s/\[\(\[[^]]*\]\)\]/\1/g' file.txt

Antwort2

Das sollte funktionieren:

awk '/{{{/,/}}}/ { gsub(/\[\[/,"[");gsub(/\]\]/,"]") } { print }'

Antwort3

Ich würde Perl mit einer untergeordneten Statusvariable verwenden. Angenommen, Sie haben das Folgende als replace.pl gespeichert:

#!/usr/bin/perl -w
my $inbraces=0;
while (<>) {
    /\{\{\{/ and $inbraces=1;
    $inbraces==1 && s/\[\[/[/;
    $inbraces==1 && s/]]/]/;
    /}}}/ and $inbraces=0;
    print $_;
}

Sie möchten etwas wie Folgendes ausführen:

cat inputfile.txt | perl replace.pl > outputfile.pl

Im Grunde durchläuft PERL dies aufgrund des while(<>) für jede Eingabezeile und schaltet für jede Zeile, wenn sie mit dem drei Klammern umfassenden regulären Ausdruck übereinstimmt, ein bzw. aus, ob die Ersetzungen stattfinden sollen. Alle regulären Ausdrücke sind nahezu identisch mit sed. Öffnende Klammern werden aufgrund ihrer Schlüsselwortnatur beim Abgleichen maskiert.

verwandte Informationen