做什么

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 前先

  1. 不带 -i 演示一遍:sed 's/a/b/g' file.txt | head
  2. -i.bak 自动备份
  3. 改完 diff 看变化

  • macOS 的 sed 跟 Linux GNU sed 行为不一样——-i 后必须跟扩展名(用 -i '');脚本跨平台要小心
  • sed -i 会改 inode——监听文件变化的工具可能丢
  • 正则默认是 BRE(基本)—— + ? | () 要转义;用 -E 启用 ERE