从中读取内容的stdout文件

时间:2012-03-11 14:14:38

标签: file bash io redirect io-redirection

当我想使用Bash修改文件时,我通常会将stdout重定向到另一个文件,然后删除原始文件。有更快的方法吗?

例如:

cut -d':' -f2 FILE > FILE

这使我的源文件为空(在写入之前将文件清空,然后开始阅读)

我所能做的就是:

cut -d':' -f2 FILE > FILE2
rm -f FILE
mv FILE2 FILE

有没有办法只需一步即将(修改过的)输出重定向到原始文件?

3 个答案:

答案 0 :(得分:0)

我担心我在bash中没有给你答案,但在zsh中这很容易:

cut -d':' -f2 =(cat FILE) > FILE

=(...)构造创建一个临时文件,其中包含所提及程序的输出,该文件在包含该程序的命令完成后将被删除。

答案 1 :(得分:0)

我担心在bash中没有方便的一般方法。问题是在运行任何命令之前,bash打开FILE输出,截断它,所以当cat打开文件时,它看到的只是新的空文件。 sed有一个-i选项来替换内联(实际上它使用临时文件),而zsh=(...),如其他答案中所述,{ {1}}手动检查输入和输出文件是否匹配(使用sort时,如我所提到的,使用shell重定向将在程序看到之前擦除文件),但-o和许多文件一样其他公用事业没有。您必须使用临时文件。

答案 2 :(得分:0)

如果您安装Colin Watson's sponge utility(Colin博客上的链接似乎已经死了,但您可以将其作为Joey Hess' moreutils package的一部分获取),您可以在转储之前使用它来“吸收”输出它回到文件中:

cat FILE | cut -d':' -f2 | sponge FILE