sed -i.bak 可安全原地修改并自动备份,需加.bak确保可回退,精准定位行或上下文避免误改,特殊字符须转义,操作前必须预览验证并留痕。

用 sed -i.bak 就能安全地原地修改文件并自动备份,关键不是“能不能改”,而是“改得准不准、退得回不回”。它会在修改前把原始文件完整复制一份(比如 nginx.conf 变成 nginx.conf.bak),再执行替换——两步原子完成,不会只备份不改,也不会只改没备份。
必须加 .bak:备份不是可选项
敏感配置(如数据库密码、SSL证书路径、监听端口)一旦写错,服务可能直接挂掉。加 .bak 后,哪怕命令出错导致整行变空或语法错误,也能立刻恢复:
-
sed -i.bak 's/listen 80;/listen 8080;/' /etc/nginx/nginx.conf→ 自动生成nginx.conf.bak - 恢复只需一条命令:
cp nginx.conf.bak nginx.conf - 不加
.bak直接用-i,等于裸奔,没有后悔药
精准定位要改的行,别全局乱替
靠关键词全文件替换容易误伤注释、样例或相似配置。推荐按实际场景选定位方式:
-
按行号改(最稳):已知端口固定在第 41 行 →
sed -i.bak '41s/listen 80;/listen 8080;/' nginx.conf -
按上下文改(更可靠):改
# SSL Certificate下一行的路径 →sed -i.bak '/# SSL Certificate/{n;s|/old/cert.pem|/new/cert.pem|}' ssl.conf -
限定段落内改:只在
[database]段里替换 host →sed -i.bak '/^\[database\]$/,/^\[/ s/^host = .*/host = 192.168.10.5/' my.cnf
特殊字符要小心转义,不然命令直接崩
路径里的 /、IP 中的 .、密码里的 $ 或 / 都是正则元字符,不处理就会匹配错或报错:
- 路径含
/?换分隔符 →sed -i.bak 's|^root = .*|root = /opt/app|' nginx.conf(用|代替/) - IP 地址含点?
.必须转义 →sed -i.bak "s/127\.0\.0\.1/$NEW_IP/" app.conf - 密码含
/或$?单引号包裹主体,变量用双引号拼接 →sed -i.bak 's|DB_PASS=.*|DB_PASS='"$DB_PASS"'|' /etc/app.conf
操作前必须预览、验证、留痕
对敏感文件跳过这步,等于主动制造事故:
- 先去
-i预览效果:sed -n '/^DB_PASS=/p' /etc/app.conf确认只命中目标行 - 执行后立刻检查备份:
ls -l *.bak看时间戳是否最新、大小是否和原文件一致 - 建议把命令连同执行时间、修改内容记到运维日志里,方便追溯


















