sed 删除 START 到 END 整块文本用 /START/,/END/d;保留首尾行仅删中间内容用 /START/,/END/{/START\|END/!d;};多段全删,加 q 可只删第一段;修改文件需加 -i 选项。

用 sed 删除“从某个关键字开始,到另一个关键字结束”的整块文本,核心是使用地址范围配合 d 命令,语法为:/start_pattern/,/end_pattern/d。
匹配起始和结束关键字的行并删除整段
sed 支持以正则表达式定义地址范围,格式为 /起始模式/,/结束模式/。只要某行匹配起始模式,就进入范围;直到首次匹配结束模式的那行(含该行)为止,整个范围内的所有行都会被删除。
- 例如,删除从
START开始、到END结束(含 START 和 END 行)之间的所有内容:sed '/START/,/END/d' file.txt - 若 START 和 END 是精确单词,建议加词界锚定,避免误匹配:
sed '/\<start>/,/<end>/d' file.txt</end></start>(GNU sed 支持\ 和 <code>\>) - 注意:该范围是“贪婪”的——只匹配第一个满足条件的
END,不会跨段跳过中间的 END。
只删除中间内容,保留 START 和 END 行
如果想保留起始行和结束行,仅删掉它们之间的部分(不含 START 和 END),可用 +1 和 -1 偏移:
-
sed '/START/{n;:a;/END/!{p;n;ba;};x;d;};x;d' file.txt—— 较复杂,不推荐初用 - 更清晰的做法是分两步或换用 awk;但 sed 简洁解法是:
sed '/START/,/END/{/START\|END/!d;}' file.txt
即:在 START 到 END 范围内,只保留匹配 START 或 END 的行,其余删除。
处理多段匹配与边界情况
默认 sed 对每段匹配只处理一次(非重叠)。若文件中有多个 START-END 段,上述命令会逐段删除全部。
- 要只删第一个段,加
q退出:sed '/START/,/END/{/END/{d;q;};d;}' file.txt - 若 END 可能不存在,sed 会从 START 一直删到文件末尾;可先确认是否存在完整段再操作。
- 空行或缩进不影响匹配,只要正则能命中即可;如需匹配带空格的关键词,把空格写进 pattern,例如
/^# BEGIN$/,/^# END$/。
实际修改文件时别忘了 -i
以上命令默认输出到屏幕。要直接改原文件,加上 -i 选项:
- 备份后修改:
sed -i.bak '/START/,/END/d' file.txt(生成 file.txt.bak) - 无备份直接改:
sed -i '/START/,/END/d' file.txt(谨慎使用)

















