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