Bash脚本显示控制台中的更改,但未显示文件中的更改如何保存更改?

问题描述

Bash脚本的新手。

我有一个带有文本的文本文件bar.txt:

123
456
789

我正试图将其反转为:

987
654
321

我设法做到这一点:

tac bar.txt | rev

但是,更改不会保存到.txt文件中,该文件仍然具有1234 ...

我如何保存更改,以便更新.txt文件? 很抱歉出现措辞不佳的问题或格式错误-Bash脚本和stackoverflow的新功能...

解决方法

根据Unix的哲学,即使用shell实用程序作为对文本进行操作的过滤器,tacrev都将其输出传递到标准输出,这就是rev能够进行操作的方式tac的输出中。

要“更新文件”,您可以将结果从rev重定向到另一个文件,如下所示。

tac bar.txt | rev > foo.txt

您不希望将输出重定向到同一文件的原因是,因为Unix管道在输入准备就绪时对其进行操作,所以foo.txt可能在{的输出时尚未被完全读取。 {1}}已准备好写入文件。

您当然可以像这样附加输出:

rev

这将附加输出,但实际上不是“更新”文件。

如果您想实际“更新文件”,则可以编写一个脚本来处理您的输入,将其通过管道传输到临时文件,然后使用类似tac bar.txt | rev >> foo.txt 的文件将其替换为新文件。命令。

我一直使用引号引起来的“更新文件”的原因是因为这种使用文件的更新内容创建临时文件或内存缓冲区然后替换原始文件的过程通常是当您“更新文件。”如果您曾经看过vim创建的带有mv -f符号的临时文件,那就是您在替换原始文件之前或在大多数人称之为“更新”的情况下正在编辑的临时缓冲区。 / p>

,

也许和

tac bar.txt | rev > bar_rev.txt
,

要使其在文件bar被更改时显示,请将输出首先写入临时文件-下面的foo-然后将其mv写到bar

$ tac bar | rev > foo && mv foo bar
$ cat bar
987
654
321