Приведем пример текста:
.... текст ,.. {{{питон строка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. Открытые фигурные скобки экранируются при сопоставлении из-за их ключевой природы.