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,一边改一边留原文件,出问题直接换回来,比事后从备份里找省事得多。