Linux下如何用sed替换file1前4行为file2前3行?
解决sed替换文件行的问题
你的需求是把file1.dat的前4行替换成file2.dat的前3行,原来的sed命令逻辑没踩对点子,咱们一步步来修正:
问题出在哪?
你执行的命令:
sed -i.bak '1,4d;3r file2.dat' file1.dat
首先1,4d删除了file1.dat的前4行,剩下的内容是5-10(此时文件的行号会重新编为1-6)。然后3r file2.dat是在当前第3行(也就是原内容的7)后面插入file2.dat的全部内容,这完全不符合你想要的“在开头插入file2前3行”的逻辑,所以结果自然不对。
正确的解决方案
方法一:用cat+tail/head组合(最直观好理解)
这种方法不需要复杂的sed语法,直接拼接你需要的内容就行:
# 先拼接file2的前3行和file1从第5行开始的内容,写入临时文件 { head -3 file2.dat; tail +5 file1.dat; } > temp_file.dat # 替换原文件 mv temp_file.dat file1.dat
如果想要保留原文件的备份,可以先复制一份:
cp file1.dat file1.dat.bak { head -3 file2.dat; tail +5 file1.dat; } > file1.dat
方法二:用sed实现(适合纯sed场景)
如果一定要用sed,可以结合bash的进程替换来插入file2的前3行,同时删除file1的前4行:
sed -i.bak -e '1,4d' -e '1r <(head -3 file2.dat)' file1.dat
解释一下:
1,4d:删除file1的前4行1r <(head -3 file2.dat):在处理后的第1行(也就是原file1的第5行)之前插入file2.dat的前3行内容
如果是POSIX兼容的sed(不支持进程替换),可以先把file2的前3行导出到临时文件,再用sed读取:
head -3 file2.dat > temp_lines.dat sed -i.bak -e '1,4d' -e '1r temp_lines.dat' file1.dat rm temp_lines.dat
验证结果
执行完后,file1.dat的内容会变成:
1a 2a 3a 5 6 7 8 9 10
完全符合你的预期。
内容的提问来源于stack exchange,提问作者Tomasz
相关产品推荐
相关产品推荐

