sed删除配置文件第5到第10行直接用sed -i '5,10d' /path/to/config.conf,该命令按物理行号删除,含空行和注释行,行号超出则删至末尾,加-i.bak可备份。

用 sed 删除配置文件中第5到第10行
直接用 sed -i '5,10d' /path/to/config.conf 即可。这个命令会原地修改文件,把第5行到第10行(含)全部删掉。注意行号是基于原始文件的物理行数,空行、注释行都算在内。
常见错误是误以为行号从匹配结果开始计——sed 的地址范围 5,10 永远指文件的第5–10行,不是“找到某个关键字后的第5行”。如果目标行号不固定,得先用 grep -n 算出起止位置再拼接命令。
- 加
-i才会真正写回文件;测试时先去掉-i,用sed '5,10d' file看输出是否符合预期 - 行号超出范围(比如文件只有8行,却删
5,10)不会报错,sed 会删到最后一行为止 - 如果要保留备份,用
-i.bak,执行后生成config.conf.bak
删除从某一行开始直到匹配到特定模式的行(含该模式行)
比如删掉从 # BEGIN CUSTOM 开始,一直到 # END CUSTOM(含)之间的所有内容,用:sed -i '/# BEGIN CUSTOM/,/# END CUSTOM/d' config.conf。这里两个地址都是正则匹配,只要某行满足任一条件就触发范围起/止。
容易踩的坑:如果 # BEGIN CUSTOM 出现多次,每次都会触发一个删除区间;若 # END CUSTOM 缺失,sed 会一直删到文件末尾。生产环境建议先确认匹配是否唯一:grep -n '# BEGIN CUSTOM\|# END CUSTOM' config.conf。
- 正则中特殊字符如
.、*、^需转义,例如删server { ... }块,得写/server \{/,/}/d - 用单引号包裹命令,避免 shell 解析掉斜杠或美元符
- 如果模式行本身也要被删,不能写成
/BEGIN/,/END/{/BEGIN\|END/d}——多余且无效,d已包含两端
结合行号与模式混合定位,比如“从第20行起,删到第一个空行”
sed 本身不支持“第N行之后 + 模式匹配”的复合地址,但可以用两步模拟:sed -i '20,$ {/^$/q; d}' config.conf。意思是:从第20行开始(20,$),遇到空行(/^$/)就退出(q),否则删掉当前行(d)。
这个写法的关键在于 q 是“退出 sed 处理”,不是“跳过当前行”。所以它能实现“删到但不含空行”。如果想连空行一起删,把 q 换成 d 再加个 q 就行:sed -i '20,$ {/^$/d; /^$/q}' ——但其实第二句永远不会执行,所以更稳妥的是用 20,/^\s*$/d(允许空格的空行)。
-
20,$中的$表示“最后一行”,不是正则锚点 - 嵌套命令必须用花括号,且
{后不能有空格,}前不能有分号(GNU sed 宽松,但 POSIX 不保证) - 空行判断用
/^$/最安全;/^\s*$/要求 sed 支持\s(GNU sed 可以,BSD sed 得写/^[[:space:]]*$/)
误删后如何快速恢复
sed -i 没有撤销机制。如果没加备份后缀,且文件没被其他进程锁住,可以立刻从内存中恢复:Linux 下已打开的文件即使被删,只要进程还活着,/proc/PID/fd/N 仍可读。但配置文件通常由 root 运行,普通用户看不到。最现实的办法是依赖版本控制或定期备份。
真正值得养成的习惯是:任何 sed -i 操作前,先跑一次 cp config.conf config.conf.$(date +%s)。别信“就改一行”,行号计算错误、管道漏掉、shell 变量未展开,都可能让 d 删掉整份文件。
还有个隐蔽风险:某些配置文件(如 /etc/passwd)被多个进程频繁读取,sed -i 的原子替换可能引发短暂不一致。这种场景应该用 awk 或专用工具(如 usermod)操作。











