2012-03-11 96 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

相關問題