替换命令 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,就会把本不该动的第二处也一起改掉。