sed替换字符串核心三步:确认目标、预览效果、安全执行;默认不修改原文件,加-i才生效,但linux与macos语法不同,推荐用sed -i.bak统一写法并注意分隔符选择。

直接用 sed 替换文件字符串,核心就三步:确认目标、预览效果、安全执行。别一上来就加 -i,否则改错没法回退。
基础替换:先看效果再动手
默认情况下,sed 不会动原文件,只把结果输出到终端——这是它的保护机制。
- 替换每行第一个
foo:sed 's/foo/bar/' file.txt - 替换每行所有
foo(加g):sed 's/foo/bar/g' file.txt - 想确认是否匹配成功?先用
grep -n 'foo' file.txt看位置,再跑上面命令看输出
就地修改:-i 选项必须带备份或分清系统
-i 是“真改文件”的开关,但行为在 Linux 和 macOS 上完全不同:
- Linux(GNU sed):
sed -i 's/foo/bar/g' file.txt可直接用 - macOS(BSD sed):
sed -i '.bak' 's/foo/bar/g' file.txt必须带后缀,否则报错 - 跨平台脚本统一写法:
sed -i.bak 's/foo/bar/g' file.txt,改完再rm *.bak - 不放心?先运行不带
-i的命令,确认输出无误后再加
多文件批量处理:避开空格和通配符陷阱
用 *.conf 看似简单,但文件名含空格、路径有特殊字符时会崩。
- 安全做法(推荐):
find . -name "*.log" -type f -exec sed -i 's/error/warn/g' {} \; - 更健壮(支持换行/空格):
find . -name "*.log" -type f -print0 | xargs -0 sed -i 's/error/warn/g' - 别写
for f in *.txt; do sed -i "$f"; done——空目录下会误操作当前目录
含特殊字符的替换:换分隔符比转义更干净
路径、正则元字符、变量插值都容易翻车,关键在分隔符和引号:
- 替换
/usr/bin→/opt/bin?用#当分隔符:sed -i 's#/usr/bin#/opt/bin#g' file - 要匹配点号、星号等?前面加反斜杠:
\.、\*;斜杠只在分隔符位置冲突,不用额外转义 - 用变量?双引号 + 自定义分隔符:
OLD="/old"; NEW="/new"; sed -i "s#$OLD#$NEW#g" file











