如何使用sed仅删除指定序号的匹配地址范围
sed按序号删除指定匹配地址范围的方法
sed -n '/#/,/\$/p'会匹配文本中所有从包含#的行开始、到第一个包含$的行结束的连续文本块,要实现按序号删除第N个匹配块,可以通过块内计数判断的方式实现,无需额外工具配合。
删除第2个匹配块的可用命令
直接对目标文件执行以下命令,即可得到你给出的预期输出:
sed ' :loop /#/ { x s/^/1/ /^1\{2\}$/ { x :del_block N /\$/!b del_block d } x N /\$/!b loop } ' 你的文件路径
自定义删除序号的方法
如果需要删除第N个匹配块,只需要把命令中正则/^1\{2\}$/里的数字2替换为目标序号即可:
- 删除第1个匹配块:替换为
/^1\{1\}$/ - 删除第3个匹配块:替换为
/^1\{3\}$/
效果验证
对你提供的测试文本执行上述删除第2个块的命令,输出结果和预期完全一致:
foo #bar foo $ foobar foobar
小提示:如果不需要直接修改原文件,可以在命令末尾加
> 输出文件路径将结果保存到新文件;如果要直接修改原文件,给sed添加-i参数即可。
内容的提问来源于stack exchange,提问作者Joshro
相关产品推荐
相关产品推荐

