如何在Bash脚本中向文件顶部添加内容?sed命令尝试失败
解决sed修改文件时内容被清空的问题
兄弟,我太懂你踩的这个坑了!你执行命令后文件被清空,根本问题不在sed的替换逻辑,而是shell处理重定向的顺序——当你写sed ... READ_ME.md > READ_ME.md时,shell会先执行右边的重定向操作:它会先打开READ_ME.md并把它截断成空文件,然后才会让sed去读取这个已经空了的文件,最后sed输出空内容,自然文件就被清空了。
给你两个靠谱的解决方案,任选其一就行:
方案1:用sed的原地编辑功能(最便捷)
直接用sed的-i参数实现原地修改,绕开重定向的坑:
sed -i '1s/^/one /' READ_ME.md
小提醒:如果你用的是macOS或者BSD系统的sed,
-i参数需要额外指定备份后缀(比如-i.bak会生成一个READ_ME.md.bak的备份文件),要是不想留备份,就这么写:sed -i '' '1s/^/one /' READ_ME.md
方案2:用临时文件过渡(更稳妥)
如果怕原地编辑误操作搞坏文件,先把sed的输出写到临时文件,确认内容没问题后再替换原文件:
sed '1s/^/one /' READ_ME.md > temp_readme.md && mv temp_readme.md READ_ME.md
这种方式的好处是,万一你sed命令写错了,原文件还完好无损,你可以先打开临时文件检查内容,没问题再替换。
其实你之前的sed替换逻辑是对的——在第一行开头添加内容,只是栽在了shell重定向的顺序上,换上面两种方法就能解决啦!
内容的提问来源于stack exchange,提问作者c_idle
相关产品推荐
相关产品推荐

