当我想使用Bash修改文件时,我通常会将stdout重定向到另一个文件,然后删除原始文件。有更快的方法吗?
例如:
cut -d':' -f2 FILE > FILE
这使我的源文件为空(在写入之前将文件清空,然后开始阅读)
我所能做的就是:
cut -d':' -f2 FILE > FILE2
rm -f FILE
mv FILE2 FILE
有没有办法只需一步即将(修改过的)输出重定向到原始文件?
答案 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