sed在第一行前插入需用1i命令:gnu sed用sed -i '1i内容',macos需sed -i '' '1i'后换行写内容,跨平台推荐printf拼接法。

用 sed 在文件第一行顶部插入一行(比如全局变量声明),关键是用 i(insert)命令,并确保它作用在第 1 行前。注意:不同系统(GNU vs BSD/macOS)的 sed 语法略有差异,下面分情况说明。
GNU sed(Linux 常见)
直接使用 i 命令,在第 1 行前插入内容:
sed -i '1ideclare VAR="value"' file.sh
说明:
-
-i表示就地修改(备份可加后缀,如-i.bak); -
1i表示“在第 1 行之前插入”,反斜杠是必需的换行符转义(GNU sed 要求); - 插入内容紧接在
后面,不能换行(否则报错); - 若变量值含特殊字符(如
/、&、),需提前转义或改用 shell 变量拼接。
BSD/macOS sed(不支持无空格的 i)
macOS 的 sed 要求 i 命令后换行,且必须用 -i ''(空字符串参数):
sed -i '' '1i declare VAR="value"' file.sh
说明:
-
-i ''是 macOS 必需写法(否则报错); -
1i后必须真正换行,再写要插入的内容; - 如果用单行写法(如
1ideclare...),macOS sed 会忽略或报错; - 建议用双引号包裹整个命令,方便嵌入 shell 变量:
VAR="prod"; sed -i '' "1i\ declare VAR="$VAR"" file.sh
注意:这里用了两个反斜杠 \,因为 shell 先解析一层,sed 再解析一层。
通用安全写法(跨平台兼容)
避免依赖不同 sed 实现,推荐用 printf 拼接更可靠:
{ printf 'declare VAR="value"
'; cat file.sh; } > tmp && mv tmp file.sh
说明:
- 先输出要插入的行,再拼接原文件全部内容;
- 不依赖 sed 特性,所有 Unix-like 系统都适用;
- 适合脚本中频繁操作,逻辑清晰不易出错;
- 若需原子性,可用
mktemp生成临时文件再替换。
常见坑点提醒
插入失败往往因这些细节:
- 忘记
-i参数 → 只打印不修改; - macOS 没写
-i ''→ 报 “illegal option”; - 插入内容含
&或→ sed 会误当作替换引用,需转义为&或\1; - 文件为空 → GNU sed 仍能插入,但 BSD sed 可能行为异常,建议先判断
[ -s file ]; - 编码或 BOM 头干扰 → 插入后首行乱码,可先用
dos2unix或iconv清理。











