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á sed
o awk
funcionará?
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.