登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux sed 原地替换前如何保留备份文件

来源:17golang原创

时间:2026-09-11 09:48:06 429浏览 收藏

在 Linux 上用 GNU sed 改配置文件,想保留替换前的内容,关键是给 -i 写出备份后缀,而不是只写一个裸的 -i。最常用的形式是 sed -i.bak 's/旧值/新值/g' app.conf:sed 修改 app.conf,同时把原内容保存为 app.conf.bak

备份后缀紧跟在 -i 后面,例如 -i.bak;GNU sed 会把它追加到原文件名。生产脚本先用无 -i 的命令预览,再用 diff 检查,备份文件保留到确认发布之后。
要点速览
  • -i.bak 会生成同目录的 文件名.bak,不写后缀则没有备份。
  • -i 后面的后缀是可选参数,短选项不要写成容易误读的分离形式。
  • 替换前用标准输出预览,替换后用 diff 比较目标文件和备份文件。

Linux sed -i.bak 怎样生成可回滚的备份

GNU sed 的 -i[SUFFIX] 表示原地编辑。给出 SUFFIX 时,旧文件先按后缀改名保存,临时输出再占用原文件名。因此下面这条命令结束后,app.conf 是新内容,app.conf.bak 是替换前的内容:

# 只替换完整的配置行,并保留替换前文件
sed -i.bak 's/^port=8080$/port=8081/' app.conf

# 查看两个文件是否都存在,再比较实际差异
ls -l -- app.conf app.conf.bak
diff -u -- app.conf.bak app.conf

后缀可以是 .bak.orig 或带日期含义的固定字符串。它不是目录名,也不会自动清理旧备份;如果 app.conf.bak 已经存在,脚本应先决定是覆盖、改用新后缀,还是把旧备份移到受控的归档位置。

Linux GNU sed -i.bak 将原文件、临时输出和 app.conf.bak 备份连接起来的静态结构图
图1:GNU sed 的原地替换配置与备份文件名关系,重点看 SUFFIX 如何落到原文件名后面。

后缀怎么选,哪些 -i 写法容易出错

在 GNU sed 中,不含星号的后缀直接追加到当前文件名;例如 -i.orig 对应 app.conf.orig。带星号的后缀属于 GNU 扩展,可以把星号替换为当前文件名,但跨环境脚本不建议依赖这个特性。

写法结果适用判断
-i.bak修改原文件并生成 文件.bak需要明确回滚点
-i.orig修改原文件并生成 文件.orig项目已有统一后缀
-i修改原文件,不生成备份已由版本控制或外部快照兜底
-i .bak容易把 .bak 当成输入文件不要这样写

尤其要区分 sed -Ei '...'sed -iE '...':前者是启用扩展正则并且不留备份,后者在 GNU sed 中可能把 E 当成备份后缀。想同时使用扩展正则和备份后缀,写成 sed -E -i.bak '...' file 更清楚。

替换前后怎样复查并准备回滚

先去掉 -i,让 sed 把结果输出到标准输出,确认匹配范围没有过宽:

# 先预览,不改动原文件;^ 和 $ 限定整行配置
sed 's/^port=8080$/port=8081/' app.conf

# 确认预览后再原地替换,并留下可回滚副本
sed -i.bak 's/^port=8080$/port=8081/' app.conf

# 只接受预期差异;需要恢复时用备份覆盖回去
diff -u -- app.conf.bak app.conf
# cp -- app.conf.bak app.conf

如果文件属于版本库,仍建议保留 .bak 到变更确认完成;备份和版本控制解决的是不同问题,前者提供就地回退,后者提供可追踪的提交历史。对配置文件批量处理时,避免把 /etc 下的所有文件直接交给通配符,先列出目标清单,再逐个比较差异。

Linux 脚本里的权限、覆盖和跨平台边界

sed -i 通常需要目标目录可写,因为 GNU sed 会创建临时文件并在完成后替换原文件名;文件本身是只读,并不等于目录不可写。脚本要先确认运行用户、目录权限和符号链接策略,再决定是否允许原地编辑。

Linux 上的 GNU sed 与 macOS/BSD sed 对 -i 的参数处理不同。GNU sed 常写 -i.bak;BSD sed 常写 -i '' 表示不备份,若要备份则另行给出后缀。需要跨平台运行时,应在脚本中识别工具实现,或者统一使用临时文件加 mv 的方案,不要假设一条 -i 命令在两边都相同。

GNU Linux sed 与 BSD macOS sed 的 -i.bak、-i 空后缀、目标文件和 diff 复查边界图
图2:Linux/GNU sed 与 BSD/macOS sed 的 -i 参数边界,迁移脚本时不要把两种写法混用。

相关问题

sed -i.bak 会在没有发生替换时生成备份吗?

GNU sed 会按指定后缀创建备份,不能把“没有匹配到文本”当成“没有生成备份”。如果备份是否产生会影响后续逻辑,就在命令前后显式检查文件状态。

为什么不建议直接使用 sed -ni?

-n 会关闭自动输出,若脚本没有显式使用 p 打印匹配内容,原地编辑可能得到空文件。需要静默选项时,先在副本上验证脚本输出。

备份文件应该什么时候删除?

diff、服务配置检查和发布结果都确认后再删除;自动化任务可以按统一保留周期清理,但不要在替换命令刚成功后立刻删除唯一回滚副本。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>