2012-02-21 100 views
1

我使用bash和linux來完成向文件頂部添加內容。 到目前爲止,我知道我可以通過使用臨時文件來完成此操作。所以 我這樣做是這樣的:如何將StdOut添加到文件頂部(而不是底部)?

tac lines.bar > lines.foo 
echo "a" >> lines.foo 
tac lines.foo > lines.bar 

但有沒有這樣做,而無需編寫第二個文件的一個更好的辦法?

回答

2
echo a | cat - file1 > file2 

一樣shellter的

和一行sed的。

sed -i -e '1 i<whatever>' file1 

這將插入到file1 inplace。 the sed example i referred to

+0

謝謝這正是我需要的。 – l1zard 2012-02-22 11:26:40

0

tac是非常昂貴的解決方案,尤其是當您需要使用它2x時。雖然你仍然需要使用一個tmp文件,這將花費更少的時間:每個音符

編輯從KeithThompson,現在使用的文件名和condtional /bin/mv「$$」。

{ 
    echo "a" 
    cat file1 
    } > file1.$$ && /bin/mv file1.$$ file1 

我希望這有助於

+1

我可能會寫成'(echo「a」; cat file1)> file1。$$ && mv file1。$$ file1'。 '。$$'後綴避免了對任何現有文件的破壞,如果命令失敗,'&&'避免了clobbering'文件。 – 2012-02-21 06:10:05

+0

非常好的升級,謝謝。我仍然希望相信''''進程組更高效,儘管在實踐中我總是看到子進程正在產生這樣的事情。 – shellter 2012-02-21 06:24:20

0

使用到位更換一個命名管道sed,你可以在文件的頂部添加一個命令的輸出,而不明確地需要一個臨時文件:

mkfifo output 
your_command >> output & 
sed -i -e '1x' -e '1routput' -e '1d' -e '2{H;x}' file 
rm output 

什麼這會緩衝your_command在命名管道(fifo)中的輸出,並使用sedr命令在此位置插入命令。爲此,您需要在後臺啓動your_command以避免在FIFO中阻塞輸出。

請注意,r命令在循環結束時輸出文件,所以我們需要在保留空間中緩衝第一行文件,並用第二行輸出。

我寫沒有明確需要臨時文件因爲sed可能會使用一個自己。

相關問題