如何使用命令 运行 对同一文件更新文件?

How do I update a file using commands run against the same file?

作为一个简单的例子,请考虑以下命令:

$ sort file.txt 

这将按排序顺序输出文件数据。如何将这些数据放回同一个文件中?我想用排序后的结果更新文件。

这不是解决方案:

$ sort file.txt > file.txt

... 因为它会导致文件变成空白。有没有办法在不创建临时文件的情况下更新此文件?

当然,我可以这样做:

sort file.txt > temp.txt; mv temp.txt file.txt 

但我宁愿将结果保存在内存中,直到处理完成,然后再将它们写回同一个文件。 sort 实际上有一个标志,可以让这成为可能:

sort file.txt -o file.txt

...但我正在寻找一种解决方案,该解决方案不依赖于具有特殊标志的二进制文件来解决这个问题,因为并不是所有的都可以保证。是否有某种 linux 命令可以保存数据直到处理完成?

对于排序,您可以使用 -o 选项。

对于更通用的解决方案,您可以使用 sponge,来自 moreutils 包:

sort file.txt | sponge file.txt

如下所述,此处的错误处理很棘手。如果 sponge.

之前的步骤出现问题,您可能会得到一个空文件

这是这个问题的副本,它讨论了上面的解决方案:How do I execute any command editing its file (argument) "in place" using bash?

你可以用 sed 来完成(它的 r command), and Process Substitution:

sed -ni r<(sort file) file

通过这种方式,您告诉 sed 不要打印(原始)行 (-n option) 并附加由 <(sort file).[=27= 生成的文件] 众所周知的 -i option 就是这个技巧。

例子

$ cat file
b
d
c
a
e
$ sed -ni r<(sort file) file
$ cat file
a
b
c
d
e

尝试vim方式:

$ ex -s +'%!sort' -cxa file.txt