覆盖输入文件

iru*_*var 6 files read-write

我遇到的用转换后的输出替换输入文件的内容的解决方案涉及使用临时文件或海绵实用程序。

Stephane Chazelas 在这里回答指出了另一种涉及以读写模式打开文件的方法,如下所示。

tr ' ' '\t' < file 1<> file
Run Code Online (Sandbox Code Playgroud)

这实际上如何在不损坏相关文件的情况下工作?

ric*_*ici 8

这只有效,因为tr不会更改文件大小。

1<>filefile在覆盖模式下作为标准输出打开。(<>称为读/写模式,但由于很少有程序读取stdout,因此专注于它实际执行的操作更有用。)

通常,当您重定向输出 ( >file) 时,文件以“写入”模式打开,这会导致它被创建或清空。另一个常见选项是>>file“追加”模式,它跳过清空文件的步骤,但将所有输出放在最后。1<>file也跳过清空文件,但它将写入光标放在文件的开头。(您需要1因为<>默认为 redirecting stdin,而不是stdout)。

这只是偶尔有用,因为很少有实用程序在修改时如此精确。另一种情况是搜索和替换,其中替换的长度与原始长度完全相同。(更短的替换也不起作用,因为文件在最后没有被截断;如果输出比原始文件短,你最终会得到文件末尾的任何内容仍然在最后文件。)