科技 · 实用指南
sed -i 在 Linux 可用、macOS 失败?修改前先证明参数边界
识别 sed 实现和准确 argv,预览转换结果,再选择明确的备份或临时文件替换策略。

sed -i 在 Linux 可用而在 macOS 失败时,关键证据不只是眼前的命令。GNU 与 BSD 系 sed 对 in-place 后缀的定义不同,shell 还会决定程序实际收到哪些 token。
先保留源文件、确认实现并预览 stdout,再测试明确的备份或替换分支,避免可移植性修复变成破坏性修改。
保存实现与准确参数向量
记录可执行文件路径、版本输出、操作系统、shell、完整命令和最终文件名。不要把所有差异都叫做引号问题;先证明是谁解析了参数。
修改前展开 shell 变量和数组。Linux 命令到达 BSD 系 sed 时,虽然显示相似,token 边界仍可能不同。
分开 in-place 后缀规则
GNU sed 的 -i 后缀是可选的;无后缀时不留备份,有后缀时原文件会改名。短选项组合会改变含义,-Ei 与 -iE 并不相同。
FreeBSD 手册要求 -i 后跟扩展名;空扩展名不留备份,非空值决定备份名。把扩展名当作可验证的数据。
修改前预览转换结果
先在副本上去掉 -i,把 stdout 写入新的临时文件。比较前后内容、行数、编码和匹配结果。
这样能把 sed 表达式和替换机制分开;预览错误时,先修正正则模式、转义、分隔符或换行。
选择有边界的可移植策略
受控环境可检测实现并走带明确备份后缀的分支;需要可移植时,先生成临时输出并验证后再替换。
不要只依赖另一个实现会拒绝的 sed --version。使用可处理失败的实现测试、构建系统提供的平台合同或标准临时文件路径。
用退出证明保障回滚
测试无匹配、多次匹配、带空格路径、尾换行和已有备份名,并核对每个 runner 的结果、退出码和备份策略。
小范围上线。成功意味着目标内容正确、无关字节稳定,而且只出现预期文件;失败时保留输入和 argv,不要破坏性重试。
