前言
sed(Stream Editor 流编辑器)是 Linux 系统非交互式文本处理核心命令,区别于 vim 交互式编辑,sed 以行为单位流式读取文本、匹配规则、批量修改,无需打开文件即可完成替换、删除、插入、追加、截取、格式化等操作。
在运维体系中:find 找文件、grep 查内容、sed 改内容、awk 析数据,sed 是自动化部署、配置批量修改、日志清洗、文本格式化的刚需核心工具。本文基于生产环境,从零拆解 sed 语法、核心参数、正则替换、实战案例、生产脚本及高阶避坑要点。
一、sed 核心原理与基础语法
1.1 工作原理
sed 采用逐行扫描、模式匹配、动作执行的流式工作机制:
逐行读取文件内容至内存缓冲区(模式空间),根据匹配规则筛选行,执行增/删/改/替换操作,默认输出至终端,不修改原文件;如需持久化修改,需开启原地编辑参数。
核心优势:批量自动化处理、支持正则、无交互、适配脚本自动化、超大文件处理效率极高;核心场景:配置批量更新、日志脱敏、文本批量格式化、代码批量修改。
1.2 标准基础语法
sed [可选参数] '匹配规则+执行动作' 目标文件
可选参数:控制编辑模式、是否修改原文件、静默输出等
匹配规则:行号匹配、正则匹配、范围匹配
执行动作:替换、删除、插入、追加、打印、退出等
二、sed 高频常用参数
参数 | 作用说明 | 生产场景 |
|---|---|---|
-n | 静默模式,只打印匹配行,不输出默认全部内容 | 精准筛选指定行、截取文本内容 |
-i | 原地编辑,直接修改原文件(高危) | 正式批量修改配置文件、文本文件 |
-i.bak | 原地编辑并自动生成.bak备份文件 | 生产修改必备,防止误改无法回滚 |
-e | 多点编辑,执行多条sed命令 | 单次执行多规则批量处理文本 |
-r/-E | 启用扩展正则,无需转义特殊符号 | 复杂正则替换、分组匹配场景 |
-f | 读取sed脚本文件执行规则 | 复杂规则复用、批量脚本封装 |
三、sed 核心动作指令
sed 所有文本操作均基于动作指令,以下为生产100%覆盖的核心指令:
s:substitute 替换(最核心),文本替换、内容修改
d:delete 删除,删除匹配行、空行、注释行
p:print 打印,配合-n精准输出匹配行
a:append 行后追加,匹配行下方新增内容
i:insert 行前插入,匹配行上方新增内容
c:replace 整行替换,覆盖替换整行内容
q:quit 退出,匹配后终止读取文件,提升效率
四、替换语法详解
4.1 标准替换语法
sed 's/原内容/新内容/修饰符' file
分隔符 / 可自定义为 # @ |,适配内容含斜杠的场景(如路径、URL)。
4.2 常用修饰符
g:global 全局替换,默认只替换每行第一个匹配内容
i:ignore 忽略大小写匹配
n:指定替换每行第N个匹配
p:打印替换成功的行
五、匹配规则体系
5.1 行号匹配
10s/旧/新/g:只修改第10行
5,20s/旧/新/g:修改5-20行范围
10,$s/旧/新/g:从第10行到文件末尾
5.2 正则匹配
/^#/d:匹配行首#的注释行并删除
/error/s/0/1/g:包含error的行执行替换
/start/,/end/s/旧/新/g:区间正则匹配,首尾关键字范围修改
六、sed 零基础实战示例
6.1 文本替换场景
# 1. 单行替换:把文本中root替换成admin(仅每行第一个) sed 's/root/admin/' test.txt # 2. 全局替换:所有root全部替换为admin sed 's/root/admin/g' test.txt # 3. 忽略大小写替换 sed 's/error/success/gi' app.log # 4. 路径替换(更换分隔符#,避免/冲突) sed 's#/usr/local#/opt/server#g' env.conf # 5. 仅替换第5行内容 sed '5s/80/8080/g' nginx.conf # 6. 区间替换:10-30行替换 sed '10,30s/yes/no/g' config.ini
6.2 删除行场景(清理无效内容)
# 1. 删除所有空行 sed '/^$/d' file.txt # 2. 删除所有注释行(行首#) sed '/^#/d' nginx.conf # 3. 删除空行+注释行(组合清理) sed -e '/^#/d' -e '/^$/d' nginx.conf # 4. 删除包含debug的日志行 sed '/debug/d' app.log # 5. 删除前10行 sed '1,10d' file.txt
6.3 插入与追加场景(配置新增)
# 1. 在第3行后追加一行内容 sed '3a max_file_size=1024' sys.conf # 2. 在第2行前插入头部注释 sed '2i # auto config by sed' sys.conf # 3. 在匹配行后追加内容(匹配port行) sed '/port/a timeout=60' nginx.conf # 4. 文件末尾追加内容 sed '$a # end of config' nginx.conf
6.4 整行替换与精准打印
# 1. 整行替换第8行 sed '8c listen 8080;' nginx.conf # 2. 静默打印第5-10行(等价截取文本) sed -n '5,10p' file.txt # 3. 打印匹配error的所有行 sed -n '/error/p' app.log
6.5 生产安全修改(原地备份修改)
# 原地修改并生成bak备份文件(生产标准写法) sed -i.bak 's/775/755/g' /etc/profile # 修改后可直接比对差异 diff /etc/profile /etc/profile.bak
七、sed 高阶扩展
7.1 扩展正则分组替换(-r 参数)
分组匹配 () 配合反向引用 \1 \2,实现精准截取、字段重组,是日志脱敏、格式转换核心用法。
# 1. 交换文本前后字段(分组引用) echo "name=zhangsan" | sed -r 's/(name)=(.*)/\2:\1/' # 2. 手机号中间四位脱敏 echo "13812345678" | sed -r 's/(1[0-9]{2})([0-9]{4})([0-9]{4})/\1****\3/' # 3. IP地址末尾段替换 sed -r 's/([0-9]{1,3}\.){3}([0-9]{1,3})/\100/g' ip.log
7.2 多点编辑 -e 多规则批量处理
# 同时清理注释、空行、替换关键字 sed -e '/^#/d' -e '/^$/d' -e 's/localhost/127.0.0.1/g' host.conf
7.3 find + sed 批量修改全局文件
运维顶级组合:find 批量找文件 + sed 批量改内容,适配全站配置批量更新。
# 批量修改目录下所有.conf文件端口80为8080,并备份 find /etc/nginx -name "*.conf" -exec sed -i.bak 's/80/8080/g' {} \; # 批量清理所有脚本注释和空行 find . -name "*.sh" -exec sed -i.bak -e '/^#/d' -e '/^$/d' {} \;
八、完整实战脚本
8.1 配置文件标准化清洗脚本
一键清理配置文件多余空行、注释,标准化输出纯净配置,适配服务器巡检、配置合规整改。
#!/bin/bash # 功能:配置文件标准化清洗 # 处理规则:删除注释行、删除空行、去除行首尾空格 CONF_FILE=$1 if [ ! -f ${CONF_FILE} ];then echo "文件不存在!" exit 1 fi # 原地修改并备份 sed -i.bak \ -e '/^#/d' \ -e '/^$/d' \ -e 's/^[ \t]*//g' \ -e 's/[ \t]*$//g' \ ${CONF_FILE} echo "配置清洗完成,备份文件:${CONF_FILE}.bak"
8.2 日志敏感信息脱敏脚本
批量脱敏日志中的手机号、IP、账号信息,适配日志对外输出、安全审计场景。
#!/bin/bash # 日志脱敏脚本 LOG_FILE=$1 sed -i.riskbak \ -r 's/(1[0-9]{2})([0-9]{4})([0-9]{4})/\1****\3/g' ${LOG_FILE} \ -e 's/([0-9]{1,3}\.){3}([0-9]{1,3})/***.***.***.**/g' echo "日志脱敏完成,原始备份:${LOG_FILE}.riskbak"
九、生产环境避坑核心要点
禁止直接使用 -i 裸改文件:生产必须使用 -i.bak 先备份再修改,修改无误后再删除bak文件,杜绝误改无法回滚。
替换路径务必更换分隔符:修改文件路径、URL内容时,将默认 / 分隔符改为 #,避免路径斜杠冲突导致命令失效。
默认单行首个替换,务必加 g:不加 g 只替换每行第一个匹配内容,全局替换必须携带修饰符 g。
复杂正则必须加 -r:分组、{}、+、? 等扩展正则符号,必须开启 -r 参数,否则需要手动转义,极易出错。
批量修改先测试再落地:find+sed 批量修改前,先去掉 -i 参数预览输出结果,确认无误再执行原地修改。
十、find / grep / sed 三剑客场景总结
find:文件维度——找文件、筛文件、批量操作文件属性
grep:内容维度——检索关键字、过滤行、排查日志、只读查询
sed:内容维度——改文本、删行、插入、替换、批量修改文件内容
生产黄金组合:find 找文件 → grep 筛查内容 → sed 批量修正,覆盖99%文件运维自动化场景。
总结
sed 作为 Linux 流式编辑器,核心价值是非交互式、批量自动化文本修改。熟练掌握替换、删除、插入、分组正则、批量文件修改五大核心能力,可实现配置标准化、日志清洗、文本格式化、业务自动化部署等高频场景,是运维工程师从手动操作进阶自动化的必备核心技能。