Как заменить несколько строк между разделителями

Как заменить несколько строк между разделителями

Приведем пример текста:

.... текст ,..
{{{питон
строка1 = 'abcde'
строка2 = '12345'
печать(строка1[[1:3]])
печать(строка2[[:-1]])
}}}
.... текст ,..

И [[также ]]появляются снаружи {{{too. Возможно, есть пробелы и табуляции перед {{{ и }}}.

Я хочу заменить все [[и ]]на [и ]между {{{и }}}.

Мне нужно записать результат обратно в исходный файл.

Как я могу это сделать? Будет sedили awkбудет работать?

решение1

Это может вам подойти:

sed -i '/\s*{{{/,/\s*}}}$/s/\[\(\[[^]]*\]\)\]/\1/g' file.txt

решение2

Это должно сработать:

awk '/{{{/,/}}}/ { gsub(/\[\[/,"[");gsub(/\]\]/,"]") } { print }'

решение3

Я бы использовал perl с переменной второстепенного состояния. Предполагая, что вы сохранили следующее как replace.pl:

#!/usr/bin/perl -w
my $inbraces=0;
while (<>) {
    /\{\{\{/ and $inbraces=1;
    $inbraces==1 && s/\[\[/[/;
    $inbraces==1 && s/]]/]/;
    /}}}/ and $inbraces=0;
    print $_;
}

Вам нужно будет запустить что-то вроде:

cat inputfile.txt | perl replace.pl > outputfile.pl

По сути, PERL выполняет цикл по этому для каждой строки ввода из-за while(<>) и для каждой строки, если она соответствует регулярному выражению с тремя фигурными скобками, он включает и выключает, должны ли происходить замены. Все регулярные выражения почти идентичны sed. Открытые фигурные скобки экранируются при сопоставлении из-за их ключевой природы.

Связанный контент