Isso pode funcionar para você:
sed -i '/\s*{{{/,/\s*}}}$/s/\[\(\[[^]]*\]\)\]//g' file.txt
Dado o exemplo do texto:
.... text ,..
{{{python
string1 = 'abcde'
string2 = '12345'
print(string1[[1:3]])
print(string2[[:-1]])
}}}
.... text ,..
Os [[ e ]] também aparecem fora de {{{ . Talvez haja espaços e guias antes de {{{e}}}.
Eu quero substituir todos os [[ e ]] em [ e ] entre {{{ e }}} .
Eu preciso escrever o resultado de volta ao arquivo original.
Como posso fazer isso? sed ou awk funcionará?
Isso deve funcionar:
awk '/{{{/,/}}}/ { gsub(/\[\[/,"[");gsub(/\]\]/,"]") } { print }'
Eu usaria o perl com uma variável de estado menor. Supondo que você salvou o abaixo 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, PERL faz um loop sobre isso para cada linha de entrada por causa do tempo (< >) e para cada linha, se corresponder ao regex de três chaves, liga e desliga se as substituições devem ocorrer. Todos os regexes são quase idênticos aos sed. As chaves abertas escapam ao corresponder por causa de sua natureza de palavra-chave.
Tags regex awk sed linux text-editing