首页/系统/Linux 运维命令速查/sed -i 原地编辑文件
文本处理77 条

sed -i 原地编辑文件

-i 直接修改文件内容:-i.bak 先留备份再改,批量处理多文件名时配合 find / xargs。

Linux 运维命令速查系统更新于 2026-10-13

sed -i 是什么

sed -i 直接修改文件内容,是批量改配置的标准工具。它默认不留备份,所以规范做法是带一个备份后缀,先留底再改。另一个容易被忽略的细节是它的实现方式:先生成新文件再改名替换,因此 inode 会变化,硬链接会断开,指向原文件的符号链接也会被替换掉。

基本信息

适用平台GNU sed 与 BSD 或 macOS 的 sed 在就地修改用法上不兼容
命令语法sed -i[.后缀] '脚本' 文件...
常用选项-i 就地修改 / -i.bak 改前留备份 / -E 扩展正则 / -n 配打印命令只输出匹配行
实现细节先生成新文件再替换,inode 会变

典型使用场景

  • 批量替换多台配置里的地址
  • 修改一批同构文件的公共参数
  • 删除或注释掉配置里的某类行
  • 按行号区间修改特定段落
  • 批量处理前先用搜索圈定文件清单

常用示例

常用示例
sed -i.bak 's/8080/9090/' app.conf        # 先备份为 app.conf.bak
sed -i 's/DEBUG/INFO/g' conf.d/*.conf
sed -i '/^#/d' legacy.conf                # 删除所有注释行
sed -i '10,20s/old/new/g' file.txt        # 只改指定行区间
# 批量且文件名复杂时:
find /etc/myapp -name '*.conf' -print0 | xargs -0 sed -i.bak 's/old/new/g'

常见操作

写法作用提示
就地修改无后缀直接修改,不留备份生产环境不建议直接使用
带备份后缀修改并保留原件副本后缀可自定义
配删除命令删除匹配行配合地址限定范围
配替换命令替换文本最常用的组合
配打印命令只输出匹配行不需要修改时用于查看
扩展正则开关简化分组写法分组与反向引用更方便
不留备份直接就地修改生产配置,改错之后只能凭记忆回滚。规范做法是带备份后缀,或先把文件复制一份再动手。
GNU 与 BSD 的就地修改用法不同,后者要求显式给出后缀参数;跨平台脚本要分别验证,否则可能静默改错文件。
就地修改前先确认命中范围,把 -i 去掉换成打印,只看被改动的行:sed -n '/模式/p' 文件;确认只命中预期行后再加回 -i。GNU 环境建议写成 -i.bak,一边改一边留原文件,出问题直接换回来,比事后从备份里找省事得多。

易错点

  • 不留备份直接改,出问题后无法快速回退
  • macOS 与 Linux 的就地修改语法不同,跨平台脚本要分别处理
  • 就地修改会更换 inode,硬链接被断开,指向文件的符号链接被替换
  • 通配符一次匹配过多文件,改错一个就全改错,先确认文件清单
  • 正则没转义导致匹配范围超出预期,改坏了本不该动的行
  • 同时给软链接与其指向的真实文件执行替换,会产出两份内容不同的文件;动手前用 readlink -f 确认落点,只改一处

数据来源与参考

  • man 1 sed(GNU sed 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌