首页/系统/Linux 运维命令速查/sed 替换命令 s/// 深入
文本处理77 条

sed 替换命令 s/// 深入

替换是 sed 最常用动作:s/旧/新/[gI] 控制范围与大小写,分隔符可替换为 | # 等,& 与反向引用处理变形。

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

替换命令 s/// 是什么

替换是 sed 最常用的动作:s/旧/新/标志 对每一行做第一次匹配替换,加了 g 才是整行全部替换。分隔符可以换成竖线、井号等,处理路径类文本时换分隔符能大幅减少反斜杠转义。替换串里的 & 代表匹配到的整段内容,反斜杠加数字表示捕获组,用来做保留原样的变形替换。

基本信息

适用平台Linux、Unix 通用;GNU sed 与 BSD sed 在部分语法上有差异
命令语法sed 's/模式/替换/[标志]' 文件
常用标志g 全局替换 / I 忽略大小写 / p 打印(配 -n)/ 数字 只替换第 N 处
扩展能力& 引用整段匹配、捕获组反向引用、自定义分隔符、地址限定范围

典型使用场景

  • 批量修改配置里的旧地址或旧域名
  • 清理文本:去掉行首行尾空白、去掉多余空行
  • 脱敏导出:把日志里的手机号或邮箱做部分遮蔽
  • 给每一行加前后缀,例如包上引号或加注释符
  • 配合文件清单做「先圈定再替换」的批量操作

常用示例

常用示例
sed 's/old/new/' file                    # 只替换每行第一处
sed 's/old/new/g' file                   # 全局替换
sed 's|/var/www|/srv/www|g' file         # 路径用竖线当分隔符少转义
sed -E 's/(user=)[^ ]+/\1admin/g' file   # 捕获组保留前缀
sed 's/^ *//; s/ *$//' file              # 去行首行尾空格
sed -n '10,20s/old/new/gp' file          # 只在指定行区间替换并打印
sed '/^#/!s/a/b/g' file                  # 跳过注释行

标志与特殊写法

写法含义
s/a/b/每行替换第一处
s/a/b/g每行替换所有出现
s/a/b/2只替换每行第 2 处
s/a/b/I比较时忽略大小写
s/a/b/gp替换并打印(需配合 -n)
&替换串中代表整段匹配内容
反斜杠加数字引用第 1、第 2 个捕获组
s|a|b|用竖线作分隔符
反向引用需要开启扩展正则(-E),或者在基本正则里写成转义括号。想在替换串里输出数字前缀又不想被当成组号时,用花括号把组号明确起来。
默认只替换每行第一处,忘记 g 是高频错误;反过来说,只想替换第一处却加了 g,就会把本不该动的第二处也一起改掉。

易错点

  • 默认只替换每行第一处,忘记 g 是最常见的失误,需要精确替换其他位置时用数字标志
  • 待替换文本本身含分隔符时必须转义或换分隔符,写满反斜杠最容易出错
  • 替换串里的 & 有特殊含义,想输出字面量要写成转义形式
  • GNU 与 BSD/macOS 的 -E 与 -i 用法不同,跨平台脚本要分别验证
  • 替换前不留备份、也不先用 grep 圈定范围,改错之后很难快速回退

数据来源与参考

  • man 1 sed(GNU sed 手册)

相关工具

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