Como substituir múltiplas linhas entre delimitadores

Como substituir múltiplas linhas entre delimitadores

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 sedou awkvai 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.

informação relacionada