如何替换文件中指定标记下方的所有匹配模式?
仅替换标记下方指定字符串的解决方案
需求说明
现有输入文件内容:
blah blah blah blah blah blah string blah blah blah blah #####TAG##### blah blah blah blah blah blah blah string blah blah string blah
需要仅将#####TAG#####标记下方的所有string替换为another_string,处理后输出内容:
blah blah blah blah blah blah string blah blah blah blah #####TAG##### blah blah blah blah blah blah blah another_string blah blah another_string blah
基础sed命令会替换所有匹配项,无法满足需求,以下是可行的解决方案:
使用sed实现
利用sed的地址范围匹配功能,指定从标记行到文件末尾的范围执行替换:
sed '/#####TAG#####/,$ s|string|another_string|g' input_file
/#####TAG#####/,$:定义处理范围为从匹配到#####TAG#####的行开始,直到文件结束s|string|another_string|g:在上述范围内将所有string替换为another_string
使用Perl实现
通过设置开关变量控制替换逻辑,仅在标记行之后执行替换:
perl -pe 'if (/#####TAG#####/) { $flag = 1; } if ($flag) { s/string/another_string/g; }' input_file
- 首先定义一个
$flag变量,初始为未激活状态 - 当匹配到
#####TAG#####行时,将$flag设为1 - 后续所有行只要
$flag为1,就执行字符串替换操作
内容的提问来源于stack exchange,提问作者jean-christophe manciot
相关产品推荐
相关产品推荐

