2014-02-18 122 views
0

我經常發現自己將一系列shell命令串起來,最終目標是替換文件的內容。但是,使用>時,會打開原始文件進行寫入,因此您將丟失所有內容。覆蓋文件的內容:替代`>`?

缺少一個更好的術語,是否有一個「懶惰評估」版本的>,將等到所有先前的命令已經在打開文件寫入前執行過?

目前我使用:

somecommand file.txt | ... | ... > tmp.txt && rm file.txt && mv tmp.txt file.txt 

這是相當難看。

回答

1

sponge將幫助這裏:

(從手冊頁引用)

名稱 海綿 - 沉浸標準輸入和寫入文件

提要 sed的 '...'文件| grep'...'|海綿文件

說明 海綿讀取標準輸入並將其寫出到指定文件。 與shell重定向不同,海綿會在打開 輸出文件之前吸收其所有輸入。這允許構建從中讀取的管道和從 寫入相同的文件。

It also creates the output file atomically by renaming a temp file into 
    place, and preserves the permissions of the output file if it already 
    exists. If the output file is a special file or symlink, the data will 
    be written to it. 

    If no output file is specified, sponge outputs to stdout. 

參見:Can I read and write to the same file in Linux without overwriting it? on unix.SE