![如何在分隔符之间替换多行](https://linux22.com/image/1316685/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%88%86%E9%9A%94%E7%AC%A6%E4%B9%8B%E9%97%B4%E6%9B%BF%E6%8D%A2%E5%A4%9A%E8%A1%8C.png)
给出文本示例:
.... 文本 ,.. {{{Python 字符串1 = 'abcde' 字符串2 = '12345' 打印(string1[[1:3]]) 打印(string2[[:-1]]) }}} .... 文本 ,..
和[[
也]]
出现在 之外{{{
。可能在 {{{ 和 }}} 之前有空格和制表符。
我想将所有[[
和代]]
入[
和]
之间{{{
。}}}
我需要将结果写回原始文件。
我该怎么做?会成功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
基本上,由于 while(<>),PERL 会针对输入的每一行进行循环,并且对于每一行,如果它与三括号正则表达式匹配,它会打开和关闭是否应进行替换。所有正则表达式几乎与 sed 相同。由于其关键字性质,匹配时会转义开括号。