Cómo sustituir varias líneas entre delimitadores

Cómo sustituir varias líneas entre delimitadores

Dado el ejemplo del texto:

.... texto ,..
{{{pitón
cadena1 = 'abcde'
cadena2 = '12345'
imprimir(cadena1[[1:3]])
imprimir(cadena2[[:-1]])
}}}
.... texto ,..

El [[y ]]también aparecen fuera de {{{también. Quizás haya espacios y tabulaciones antes de {{{ y }}}.

Quiero sustituir all [[y ]]dentro [y ]entre {{{y }}}.

Necesito volver a escribir el resultado en el archivo original.

¿Cómo puedo hacer esto? ¿Será sedo awkfuncionará?

Respuesta1

Esto podría funcionar para usted:

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

Respuesta2

Esto debería funcionar:

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

Respuesta3

Usaría Perl con una variable de estado menor. Suponiendo que guardó lo siguiente como replace.pl:

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

Querrás ejecutar algo como:

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

Básicamente, PERL recorre esto para cada línea de entrada debido al while(<>) y para cada línea, si coincide con la expresión regular de tres llaves, activa y desactiva si las sustituciones deben realizarse. Todas las expresiones regulares son casi idénticas a sed. Las llaves abiertas se escapan cuando coinciden debido a su naturaleza de palabra clave.

información relacionada