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.txt
hello
conv=notrunc
如果if=insert.txt
省略,则可以从键盘插入任何文本。请注意,“插入”在这里实际上是错误的术语。 “覆盖”可能更好地描述正在发生的事情(请参阅第二行的第一个字符被 末尾的换行符覆盖insert.txt
)。
但您不会想以这种方式编辑文件。