📖 sed 流编辑器速查

按使用场景分组,点击"复制"按钮一键复制命令

文本替换(s 命令)
替换每行第一个匹配(默认只换一个,最常见的踩坑点)
sed 's/foo/bar/' file.txt
替换每行所有匹配(g = global,大多数情况下都该加)
sed 's/foo/bar/g' file.txt
只替换每行第 2 个匹配(数字旗标,从 1 开始数)
sed 's/foo/bar/2' file.txt
换分隔符处理路径(用 | 或 # 当分隔符,不用再转义 /)
sed 's|/old/path|/new/path|' file.txt
& 引用整个匹配串(给匹配内容加前后缀)
sed 's/foo/[&]/g' file.txt
分组后向引用 \1 \2(交换两列顺序)
sed 's/\(.*\),\(.*\)/\2,\1/' file.txt
忽略大小写替换(GNU 扩展 I 旗标,BSD/macOS 不支持)
sed 's/foo/bar/gI' file.txt
删除与过滤行
删除所有匹配行
sed '/pattern/d' file.txt
删除空行
sed '/^$/d' file.txt
删除注释行(# 开头)
sed '/^#/d' file.txt
删除第 2 到 5 行(闭区间,含两端)
sed '2,5d' file.txt
删除最后一行($ 表示末行)
sed '$d' file.txt
反向过滤:只保留匹配行(!d 等价于 grep)
sed '/pattern/!d' file.txt
插入、追加与整行替换
在匹配行前插入一行(i\ = insert)
sed '/pattern/i\新增的一行' file.txt
在匹配行后追加一行(a\ = append)
sed '/pattern/a\追加的一行' file.txt
整行替换匹配行(c\ = change,整行换掉而不是替换关键词)
sed '/pattern/c\整行换掉' file.txt
在第 1 行前插入(给文件头加 shebang/注释)
sed '1i\#!/bin/bash' file.txt
在文件末尾追加一行($ 定位末行 + a\)
sed '$a\# end' file.txt
行寻址与范围
只打印第 3 行(-n 关掉默认输出 + p 打印,等价 head -3 | tail -1)
sed -n '3p' file.txt
打印第 2 到 5 行(闭区间)
sed -n '2,5p' file.txt
从匹配行打印到文件尾(/start/ 搭配 $)
sed -n '/start/,$p' file.txt
打印两个模式之间的行(含 BEGIN/END 边界行,取配置块常用)
sed -n '/BEGIN/,/END/p' file.txt
步进寻址:打印奇数行(GNU 扩展 first~step,1~2 即 1、3、5…)
sed -n '1~2p' file.txt
原地编辑与调试查看
原地修改文件(-i 直接改文件,⚠️ 先确认或先备份)
sed -i 's/foo/bar/g' file.txt
原地修改并保留备份(生成 file.txt.bak,反悔可恢复)
sed -i.bak 's/foo/bar/g' file.txt
批量处理多个文件(通配符展开后逐个原地改)
sed -i 's/foo/bar/g' *.conf
macOS 注意:BSD sed 的 -i 必须跟备份后缀(空串表示不留备份)
sed -i '' 's/foo/bar/g' file.txt
显示不可见字符(\t 显示为 \t、行尾显示 $,排查 \r 和 Tab 必备)
sed -n 'l' file.txt
去掉 Windows 换行符 \r( CRLF 转 LF,脚本跨平台执行报错时常用)
sed -i 's/\r$//' file.txt