如何使用命令 运行 对同一文件更新文件?
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
作为一个简单的例子,请考虑以下命令:
$ 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