如何用sed将文件内容插入到另一文件第二行后?解决原内容丢失问题
用sed将文件内容插入另一个文件行之间的正确方法
为什么你的命令会清空原文件?
你用的sed '2r myfile.txt' mydata.txt > mydata.txt会先触发shell的重定向操作——>符号会在sed开始读取mydata.txt之前就清空这个文件,等sed去读的时候,mydata.txt已经是空的了,最终输出自然也是空,导致原内容完全丢失。
正确的解决办法
方法1:用临时文件中转
先把sed处理后的结果输出到临时文件,确认没问题后再覆盖原文件:
sed '2r myfile.txt' mydata.txt > temp.txt && mv temp.txt mydata.txt
这里&&的作用是:只有前面的sed命令执行成功(没有报错),才会执行后面的mv操作,避免临时文件为空时误覆盖原文件。
方法2:使用sed的原地编辑选项(-i)
大多数sed版本支持-i选项直接修改原文件,无需临时文件:
- GNU sed(Linux系统):
sed -i '2r myfile.txt' mydata.txt - BSD/macOS sed:需要指定备份后缀(执行后会生成原文件的备份,比如
mydata.txt.bak):
如果不需要备份,执行完可以删掉备份文件:sed -i.bak '2r myfile.txt' mydata.txtrm mydata.txt.bak
扩展说明
2r myfile.txt的含义是:在mydata.txt的第2行之后插入myfile.txt的全部内容。如果要在第N行之后插入,把数字2换成对应的N即可。- 要是需要在匹配特定内容的行之后插入,比如在包含"target line"的行之后插入,可以写成:
sed '/target line/r myfile.txt' mydata.txt > temp.txt && mv temp.txt mydata.txt
内容的提问来源于stack exchange,提问作者PleaseHelpMe222
相关产品推荐
相关产品推荐

