sed 是干什么的
sed 是流编辑器,逐行读取输入并按脚本改写文本,最常用的动作是 s 替换。默认把结果输出到屏幕,加 -i 才原地改文件,加 -i.bak 会先留一份备份。定位手段包括行号范围、正则匹配与锚点,所以批量改配置、清理注释、抽取字段这类任务几乎都靠它。GNU sed 与 BSD sed 的部分参数语法不同。
基本信息
| 适用平台 | Linux 自带 GNU sed;macOS 为 BSD sed |
|---|---|
| 替换 | sed -i 's/旧/新/g' 文件 |
| 定位 | N,M 行范围;/正则/ 匹配行;$ 表示最后一行 |
| 删除 | sed -i '/匹配/d' 文件 |
| 注意 | -i 直接改文件,不带 -i 时只打印 |
典型使用场景
- 批量修改配置项,如一键把 SELinux 调成 permissive
- 清理配置文件里的注释与空行,输出可读的最小配置
- 按正则删除历史条目,如 hosts 里过期的 IP 记录
- 抽取日志或清单中的特定行做统计前置处理
- 把多处出现的老路径统一替换成新路径
典型用法
典型用法
sed -i.bak 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config # 改配置并留备份
sed -n '20,30p' /etc/ssh/sshd_config # 只看 20 到 30 行
sed -i '/^#Port/c Port 2222' /etc/ssh/sshd_config # 整行替换匹配项
sed -n '/^Listen/p' /etc/httpd/conf/httpd.conf # 抽取匹配行
grep -v '^#' /etc/rsyslog.conf | sed '/^$/d' # 去注释与空行
sed -i '/10.0.0.9/d' /etc/hosts # 删除含指定 IP 的行
sed -i 's|/opt/old|/opt/new|g' app.conf # 内容含斜杠时换分隔符定位写法对照
| 写法 | 含义 | 适用场景 |
|---|---|---|
| s/旧/新/g | 整行所有匹配都替换 | 全文件统一改配置项 |
| s/旧/新/2 | 只替换每行第 2 处 | 行内重复词的精细修改 |
| /正则/d | 删除匹配行 | 清理指定网段或指定用户 |
| /正则/c 新内容 | 匹配行整行替换 | 把注释行改成生效行 |
| 20,40s/a/b/ | 限定行范围内替换 | 只改局部段落 |
sed -i 直接落盘且无法撤销,改 /etc 下的配置坚持加 -i.bak,并先在副本或容器里演练一遍;-i 会重建文件替换 inode,服务持有的文件需 reload 或 restart 才生效。
macOS 上的 BSD sed 需要 sed -i '' 才不把后缀当文件名,跨平台脚本要区分 GNU 与 BSD 的写法。
改配置的稳妥流程是先预览再落盘:用不带 -i 的 sed 看输出与预期是否一致,确认无误后再加 -i.bak 执行,最后用 grep 或 diff 复核改动结果。