Dado o exemplo do texto:
.... texto ,.. {{{Pitão string1 = 'abcde' string2 = '12345' imprimir(string1[[1:3]]) imprimir(string2[[:-1]]) }}} .... texto ,..
O [[
e ]]
também aparece fora de {{{
também. Talvez existam espaços e tabulações antes de {{{ e }}}.
Quero substituir tudo [[
e ]]
dentro [
e ]
entre {{{
e }}}
.
Preciso gravar o resultado de volta no arquivo original.
Como posso fazer isso? Vai sed
ou awk
vai funcionar?
Responder1
Isso pode funcionar para você:
sed -i '/\s*{{{/,/\s*}}}$/s/\[\(\[[^]]*\]\)\]/\1/g' file.txt
Responder2
Isso deve funcionar:
awk '/{{{/,/}}}/ { gsub(/\[\[/,"[");gsub(/\]\]/,"]") } { print }'
Responder3
Eu usaria Perl com uma variável de estado secundária. Supondo que você salvou o seguinte como replace.pl:
#!/usr/bin/perl -w
my $inbraces=0;
while (<>) {
/\{\{\{/ and $inbraces=1;
$inbraces==1 && s/\[\[/[/;
$inbraces==1 && s/]]/]/;
/}}}/ and $inbraces=0;
print $_;
}
Você gostaria de executar algo como:
cat inputfile.txt | perl replace.pl > outputfile.pl
Basicamente, o PERL faz um loop sobre isso para cada linha de entrada por causa do while(<>) e para cada linha, se corresponder ao regex de três chaves, ele ativa e desativa se as substituições devem ocorrer. Todas as expressões regulares são quase idênticas ao sed. Os colchetes abertos são escapados durante a correspondência devido à sua natureza de palavra-chave.