2011-09-27 68 views
93

我想編輯與sed的在OS X我使用下面的命令文件:就地編輯用的sed在OS X

sed 's/oldword/newword/' file.txt 

的輸出被髮送到終端。 file.txt未被修改。更改保存到FILE2.TXT用這個命令:

sed 's/oldword/newword/' file1.txt > file2.txt 

不過,我不希望另一個文件。我只想編輯file1.txt。我怎樣才能做到這一點?

我試過了-i標誌。這將導致以下錯誤:

sed: 1: "file1.txt": invalid command code f 
+2

什麼,當你嘗試'-i'標誌您使用的確切命令? – eldarerathis

回答

191

您可以通過它提供一個後綴添加到備份文件正確使用-i標誌。擴展您的示例:

sed -i.bu 's/oldword/newword/' file1.txt 

會給你兩個文件:一個包含替代名稱FILE1.TXT,以及一個包含有原始內容的名稱file1.txt.bu。

輕度危險

如果你想破壞性覆蓋原文件,使用這樣的:

sed -i '' 's/oldword/newword/' file1.txt 
    ^note the space 

的因爲線路被解析,是選項標誌之間所需的空間的方式和它的參數,因爲參數是零長度的。

除了可能摧毀你的原創,我不知道任何進一步的欺騙sed這種方式的危險。但是,需要注意的是,如果sed的這個調用是腳本的一部分,那麼Unix Way™(恕我直言)將非破壞性地使用sed,測試它乾淨地退出,並且只刪除無關的文件。

+0

你說得對,我在-i標誌後省略了擴展名。除了可能弄亂原始文件(並且沒有備份)之外,是否有其他原因是危險的? – SundayMonday

+0

根據'sed'手冊頁,如果設備上的磁盤空間不足,則可能會中途損壞文件並導致錯誤的輸出結果。如果你正在使用本地源碼控制'sed -i「」',在沒有備份的情況下大多數情況下應該是正常的(或者只是運行sed之前的'git init && git add -A。&& git commit -m'backup'' '-i'模式)。 – cfeduke

+1

我發現溫和的危險位特別有用。 +1 – Andre

12

我有類似的問題和MacOS

sed -i '' 's/oldword/newword/' file1.txt 

沒有作品,但

sed -i"any_symbol" 's/oldword/newword/' file1.txt 

效果很好。

2

如已經建議的那樣,您可以使用-i''--in-place)作爲sed。請參閱:The -i in-place argument,但請注意,-i選項是非標準FreeBSD擴展,可能無法在其他操作系統上使用。其次sed is a Stream EDitor, not a file editor


替代的方法是使用內置的替代在Vim的Ex模式,如:

$ ex +%s/foo/bar/g -scwq file.txt 

和多文件:

$ ex +'bufdo!%s/foo/bar/g' -scxa *.* 

要遞歸編輯的所有文件,你如果shell支持該功能,則可以使用**/*.*(由shopt -s globstar啓用)。


另一種方法是使用gawk及其新"inplace" extension如:

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1