首页/系统/信创系统运维速查/sed 批量替换与行编辑
命令与包管理65 条

sed 批量替换与行编辑

流编辑器:s 替换是常用动作,-i 原地修改(先备份)、按行号或正则定位;批量改配置的标准工具。

信创系统运维速查系统更新于 2026-10-13

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 复核改动结果。

易错点

  • 替换内容含 / 时不换分隔符(如改用 s|a|b|g)会直接报语法错误,这是最高频的用法问题
  • sed 按行处理,跨行结构如 XML、JSON 块不适合单行替换,容易改出非法格式
  • sed -i 后文件 inode 与权限可能变化,敏感文件改完要核对权限与属主
  • 正则里的点号、星号、方括号不转义会匹配到预期外的行,改配置前先用 sed -n 预览命中行
  • 一次替换写多条 s 命令时不加 -e 分隔会只执行第一条,多规则要写成 sed -e 's/a/b/' -e 's/c/d/'

数据来源与参考

  • GNU sed 手册
  • Linux 文本处理指南
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌