做什么
stream editor——流式文本编辑器。按规则改文本流,常用于自动化脚本里改文件。
最常用:替换
sed 's/old/new/' file.txt # 每行第 1 个 old → new(不改原文件)
sed 's/old/new/g' file.txt # 每行所有 old → new
sed -i 's/old/new/g' file.txt # ★ 直接改原文件(危险!加 .bak 安全:)
sed -i.bak 's/old/new/g' file.txt # 原地改 + 备份原文件为 file.txt.bak
常用动作
| 命令 | 含义 |
|---|---|
s/PAT/REPL/g |
替换 |
d |
删除行 |
p |
打印(配 -n 用) |
a\TEXT |
在行后插入 |
i\TEXT |
在行前插入 |
c\TEXT |
替换整行 |
范围(前缀)
sed '5d' file.txt # 删第 5 行
sed '1,10d' file.txt # 删 1-10 行
sed '/ERROR/d' file.txt # 删含 ERROR 的行
sed '/^$/d' file.txt # 删空行
sed -n '10,20p' file.txt # 只打印 10-20 行(配 -n)
sed '/start/,/end/p' file.txt # 从 start 到 end 之间
实战
# 改配置
sed -i 's/localhost/0.0.0.0/g' /etc/myapp/config.ini
# 删 # 开头的注释
sed -i '/^#/d' config.conf
# 删空行
sed -i '/^$/d' file.txt
# 行首加内容
sed -i 's/^/> /' file.txt # 每行前加 "> "
# 多操作
sed -e 's/foo/FOO/g' -e 's/bar/BAR/g' file.txt
sed -e '/^#/d' -e '/^$/d' config.conf # 删注释 + 删空行
引号细节
- 替换里的特殊字符(
/、&、\)要转义 &在替换里代表"整个匹配"- 路径里有
/→ 改用别的分隔符:
# 路径替换
sed 's|/old/path|/new/path|g' file
⚠ -i 是危险操作
sed -i 's/a/b/g' file.txt # 直接改,没回滚
生产用 -i 前先:
- 不带 -i 演示一遍:
sed 's/a/b/g' file.txt | head - 用
-i.bak自动备份 - 改完 diff 看变化
坑
- macOS 的 sed 跟 Linux GNU sed 行为不一样——
-i后必须跟扩展名(用-i '');脚本跨平台要小心 sed -i会改 inode——监听文件变化的工具可能丢- 正则默认是 BRE(基本)——
+?|()要转义;用-E启用 ERE