如何在命令中使用文件并将输出重定向到同一文件而不截断它?

如何在命令中使用文件并将输出重定向到同一文件而不截断它?
cat package.yaml > package.yaml

上面的内容将被截断package.yaml,因此文件将为空 -cat将有空输出。

如何避免截断文件?除了使用临时文件之外还有其他方法吗?也许是一个变量?

答案1

所有允许就地编辑文件的实用程序都是通过在内部将结果写入临时文件,然后在操作完成后用该临时文件替换原始文件来实现的。


文件就地修改,但您只能覆盖现有数据和/或扩展文件的长度。这可以使用dd实用程序来完成,例如:

$ cat file.txt
hello world
abc abc 123 123

$ cat insert.txt
hello!

$ dd if=insert.txt of=file.txt bs=1 seek=6 conv=notrunc
7+0 records in
7+0 records out 
7 bytes transferred in 0.000 secs (30918 bytes/sec)

$ cat file.txt
hello hello!
bc abc 123 123

在这里,我们通过首先在文件中向前查找 6 个字节(跳过空格)然后修改它insert.txt来插入内容。阻止输出文件在写入操作结束时被截断。file.txthelloconv=notrunc

如果if=insert.txt省略,则可以从键盘插入任何文本。请注意,“插入”在这里实际上是错误的术语。 “覆盖”可能更好地描述正在发生的事情(请参阅第二行的第一个字符被 末尾的换行符覆盖insert.txt)。

但您不会想以这种方式编辑文件。

相关内容