Como substituir várias linhas entre delimitadores

2

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á?

    
por stardiviner 30.05.2012 / 13:57

3 respostas

3

Isso pode funcionar para você:

sed -i '/\s*{{{/,/\s*}}}$/s/\[\(\[[^]]*\]\)\]//g' file.txt
    
por 31.05.2012 / 00:34
2

Isso deve funcionar:

awk '/{{{/,/}}}/ { gsub(/\[\[/,"[");gsub(/\]\]/,"]") } { print }'
    
por 30.05.2012 / 18:18
2

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.

    
por 30.05.2012 / 17:57