2012-03-11 97 views
1

当我想使用Bash修改文件时,通常会将stdout重定向到另一个文件,然后删除原始文件。有更快的方法吗?标准输出到正在读取内容的文件

例如:

cut -d':' -f2 FILE > FILE 

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

所有我能做的就是:

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

是有一种方法可以在一个步骤中将(修改的)输出重定向到原始文件?

回答

0

如果安装Colin Watson's sponge utility(科林的博客的链接似乎是死的,但你可以把它作为Joey Hess' moreutils package一部分),你可以用它为之倾倒回文件之前,“吸收”输出:

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

谢谢,我很快就会尝试,可能这正是我一直在寻找的。 – 2012-03-11 16:12:47

+0

它的工作方式正是我想要的!真的感谢! – 2012-03-11 17:33:50

0

恐怕我没有答案给你在bash,但它的zsh很容易:

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

=(...)结构创建包含节目中提到这是一个输出临时文件包含它的命令完成后删除。

+0

无论如何谢谢你。但是有没有办法像“shopt”这样做? – 2012-03-11 14:50:23

0

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

+0

感谢您的解释。 – 2012-03-11 15:13:03

相关问题