当前位置:首页 > 文章列表 > 文章 > linux > Linux sed 原地替换前如何保留备份文件

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

来源:17golang原创 2026-09-11 09:48:06 0浏览 收藏

在 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删除
Go regexp.FindAllStringSubmatchIndex Unicode 文本的字节下标怎么转换成字符区间Go regexp.FindAllStringSubmatchIndex Unicode 文本的字节下标怎么转换成字符区间
上一篇
Go regexp.FindAllStringSubmatchIndex Unicode 文本的字节下标怎么转换成字符区间
Go sync.WaitGroup Done 少调用一次为什么会一直等待
下一篇
Go sync.WaitGroup Done 少调用一次为什么会一直等待
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    704次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    712次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    789次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    749次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    583次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码