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 自动留一份备份。处理生产配置文件时优先选后者。