2010-10-20 31 views
20

我有一個調用grep來處理文本文件的腳本。目前我正在做這樣的事情。用grep就地處理

$ grep 'SomeRegEx' myfile.txt > myfile.txt.temp 
$ mv myfile.txt.temp myfile.txt 

我不知道是否有什麼辦法做到就地處理,如在商店,而無需創建一個臨時文件,然後使用臨時文件時替換原來的結果,以相同的原始文件處理完成。

當然,我歡迎評論,爲什麼這應該或不應該做,但我主要是感興趣的是否可以完成。在這個例子中,我使用的是grep,但我一般對Unix工具感興趣。謝謝!

回答

12

的Perl有-i開關,這樣做sedRuby

sed -i.bak -n '/SomeRegex/p' file 

ruby -i.bak -ne 'print if /SomeRegex/' file 

但請注意,它所做的一切都是在後端創建「臨時」文件,這是你認爲你沒有看到的,就這些。

其他方式,除了grep

AWK

awk '/someRegex/' file > t && mv t file 

慶典

while read -r line;do case "$line" in *someregex*) echo "$line";;esac;done <file > t && mv t file 
+0

如何在AWK和bash實例的原始grep的提高,不是''&&其他代替' ;'?這些仍然明確地創建一個臨時文件。 – 2017-10-18 15:22:04

2

不,一般來說它不能像Unix這樣完成。您只能創建/截斷(使用>)或附加到文件(使用>>)。一旦截斷,舊內容將會丟失。

3

一般來說,這是不能做到的。但是Perl有該-i開關:

perl -i -ne 'print if /SomeRegEx/' myfile.txt 

-i.bak將導致原來被保存在myfile.txt.bak

(當然在內部,Perl的少了點基本上你已經在做的事情 - 有沒有涉及特殊的魔力)

+2

得到它,而我一直在尋找它 - +1你的速度 – 2010-10-20 15:39:22

0

大多數安裝sed可以做就地編輯,檢查手冊頁,你可能想要-i標誌。

0

要使用vim路編輯就地文件,請嘗試:

$ ex -s +'%!grep foo' -cxa myfile.txt 

或者使用sedgawk

11

sponge(在Debian/Ubuntu中的moreutils包中)讀取輸入直到EOF並將其寫入文件,因此您可以將grep文件寫回自己。

像這樣:

grep 'pattern' file | sponge file