You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sed删除匹配后多行时如何跳过首次匹配仅删除后续重复模板

解决方案

方案1:固定模板长度场景(适配你原有的sed逻辑)

你当前的命令会匹配所有以template one开头的718行块并删除,调整后只需要跳过第一个匹配块,对后续匹配到的块执行删除即可,修改后的命令如下:

system ("sed -ie '0,/^template one/{:loop; N; /^end$/!b loop; p; d}; /^template one/,+717d' $file");

命令逻辑说明:

  • 0,/^template one/ 定位到第一个template one开头的行
  • {:loop; N; /^end$/!b loop; p; d} 读取内容直到遇到第一个end行,将第一个完整模板直接输出后跳过后续处理
  • 剩余的内容里执行/^template one/,+717d,删除所有后续出现的模板块

如果你的文件开头没有其他内容,第一行就是第一个模板的template one,也可以用更简单的写法:

system ("sed -ie '1,/^end$/!{/^template one/,+717d}' $file");

方案2:通用场景(模板长度不固定时使用)

如果后续模板行数可能调整,不用写死+717的行数,可以用awk直接读取整块处理:

system ("awk 'BEGIN{RS=\"end\\n\"} NR==1{print $0 RS; exit}' $file > ${file}.tmp && mv ${file}.tmp $file");

命令逻辑说明:

  • 把awk的行分隔符设置为end\n,每次读取一整个完整的模板块
  • 仅输出第一个块后直接退出,自动过滤后续所有重复块

注意事项

  • 如果你使用的是MacOS自带的sed,-i参数需要显式指定备份文件后缀,将-ie改为-i.bak即可,执行后会生成后缀为.bak的备份文件,确认修改无误可自行删除
  • 如果模板首尾行存在多余空格,可调整匹配规则,比如将^template one$改为/template one/,适配带空格的情况

内容的提问来源于stack exchange,提问作者Akshay Jaiswal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:51:01