sed用r命令可将外部文件内容追加到指定行之后,如sed '3r header.txt' main.txt;无原生行前插入语法,需间接实现,且gnu sed与bsd sed存在兼容性差异。

用 sed 将外部文件内容插入到目标文件的指定行,核心是使用 r 命令(read)配合行号定位。注意:sed 的 r 命令只能在匹配到某一行时,把外部文件内容**追加**到该行之后(即插入在指定行的下方),不是“替换”也不是“插入在行内”。如果要插在第 N 行**之前**,需用地址偏移或结合其他技巧。
插入到第 N 行之后(最常用)
语法:sed 'Nr filename' target.txt
例如:把 header.txt 的全部内容插入到 main.txt 的第 3 行之后:
sed '3r header.txt' main.txt
说明:
- 3r 表示“在第 3 行处理完后,读取并输出 header.txt 全部内容”;
- 原文件不会被修改,结果输出到标准输出;
- 加 -i 可直接修改原文件(如 sed -i '3r header.txt' main.txt,慎用)。
插入到第 N 行之前(间接实现)
sed 没有原生的“在第 N 行前插入”命令,但可用地址范围 + r 配合 d 或换行技巧模拟。更可靠的方式是用 sed 的多命令组合:
- 先用
sed -n '1,2p' main.txt提取前 N−1 行 - 再
cat insert.txt - 最后
sed -n 'N,$p' main.txt(从第 N 行开始输出)
但若坚持单条 sed 命令,可这样写(以插在第 3 行前为例):
sed '3i\$(cat header.txt | sed ':a;N;$!ba;s/\n/\n/g')' main.txt
⚠️ 注意:这种方法需将外部文件内容转义换行符为 \n,且仅适用于 GNU sed(macOS 默认 sed 不支持 i\ 多行插入)。实际中不推荐,易出错。
用行匹配代替行号(更健壮)
若目标位置由内容决定(如“在包含 # CONFIG 的行之后插入”),更安全:
sed '/# CONFIG/r header.txt' main.txt
说明:
- 匹配成功时,header.txt 内容插入在匹配行之后;
- 支持正则,可加 0 地址限制只匹配第一次:0\/# CONFIG\/r header.txt(GNU sed)。
注意事项与替代建议
sed 处理大文件或含特殊字符的插入内容时容易出错。实际项目中更推荐:
- 用
awk:逻辑清晰,跨平台兼容性好,例如:awk 'NR==3{system("cat header.txt")}{print}' main.txt - 用
ed(编辑器脚本):专为非交互编辑设计,精确控制插入位置 - 简单场景直接用
head/tail拼接:{ head -n 2 main.txt; cat header.txt; tail -n +3 main.txt; } > new.txt
真正需要动态、可编程插入时,sed 的 r 是轻量级首选,但务必确认行号逻辑和执行环境(Linux GNU sed vs macOS BSD sed 差异较大)。











