首页/系统/Linux 运维命令速查/sed 地址定位与删除行
文本处理77 条

sed 地址定位与删除行

用行号或正则圈定处理范围:'3d' 删第 3 行、'2,5p' 打印 2-5 行、'/start/,/end/d' 删除区间。

Linux 运维命令速查系统更新于 2026-10-13

sed 地址定位是什么

sed 的处理单位是行,地址(address)决定命令作用在哪些行上。地址可以写成行号、末行符号、正则模式,或者「起始,结束」构成的范围。掌握地址写法,就等于拿到了对配置文件和日志做精准手术的能力:删空行、去掉注释段、截取某个时间区间,都不用打开编辑器。

基本信息

用途按行号或正则圈定 sed 的处理范围
语法sed [选项] '地址 命令' 文件
地址类型行号 N、末行 $、正则 /模式/、范围 起始,结束、取反 地址!
所属GNU sed(Linux 默认),部分写法为 GNU 扩展

典型使用场景

  • 清洁配置文件:删掉注释行与空行,快速看清有效配置
  • 截取日志区间:从某个标记到另一个标记之间的内容单独取出
  • 删除指定行:去掉某一行错误配置,或删掉文件末尾的空白行
  • 按行号预览:只看文件中间某一段,避免把大文件整篇打印出来
  • 批量编辑前的干跑:先用 -n 加 p 打印将要处理的范围,确认无误再改文件

常用示例

常用示例
sed -n '10,20p' app.log          # 只打印 10 到 20 行
sed -n '$p' app.log              # 只看最后一行
sed '/^$/d' file                 # 删除空行
sed '/^#/d' conf                 # 删除注释行
sed '/BEGIN/,/END/d' file        # 删除从 BEGIN 到 END 的区间
sed '$d' file                    # 删除最后一行
sed -n '/ERROR/,/^$/p' app.log   # 打印从 ERROR 到下一个空行之间

组合与安全改文件

组合与安全改文件
sed '/^#/d; /^$/d' nginx.conf            # 一次去掉注释与空行
sed '/^listen/,/^}/p' -n srv.conf        # 打印某个配置块
sed -i.bak '/^max_connections/d' my.cnf  # 改文件并留一份 .bak 备份
sed -n '1~2p' file                       # 每隔一行打印(GNU 扩展的步长写法)
sed -n '0,/^server/p' nginx.conf         # 从首行开始匹配(GNU 扩展,可命中第一行)

地址写法对照

写法含义示例
N第 N 行sed -n '5p'
$最后一行sed -n '$p'
/模式/匹配该正则的行sed -n '/ERROR/p'
起始,结束从首次匹配起始到随后匹配结束sed '/BEGIN/,/END/d'
地址!取反,作用于不匹配的行sed '/^#/!d'
N,M按行号区间sed '2,5d'
区间地址的匹配规则值得记牢:/start/,/end/ 从第一次匹配 start 开始,到之后第一次匹配 end 结束;如果 start 与 end 都出现多次,会逐段各自匹配。要一直处理到文件末尾就写 /start/,$。
sed -i 会原地改写文件,出错时无法撤销。稳妥流程是先不带 -i 跑一遍看输出,或者用 -i.bak 让 sed 自动留一份备份。处理生产配置文件时优先选后者。

易错点

  • 忘了 -n 时 sed 默认会把每一行都打印出来:想只看指定行必须配 -n 与 p
  • 区间地址语义理解错:/start/,/end/ 按首次出现配对,重复出现的段落会被逐段处理,复杂文件先小样验证
  • 用 sed -i 直接改生产配置:没有备份也没有预览,改错只能从版本库或备份恢复
  • 把 GNU 扩展写法带到 busybox 或 macOS 的 sed 上:步长地址、0,/re/ 这类语法在非 GNU 实现里不生效

数据来源与参考

  • man 1 sed(GNU sed 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌