2012-03-02 20 views
5

有一種方法可以使用args and argdo commands的組合替換Vim中文件中字符串的所有發生次數。不幸的是,這個解決方案有一個缺點:它會打開所有可能成爲大型項目問題的文件。有誰知道更緊湊和高效的內存方式?Vim:在大型項目中查找和替換?

+3

你必須使用vim嗎?我會使用sed,這是一個更好的工具。 – 2012-03-02 22:41:11

+0

@GregHewgill我希望有機會確認一個特定的變化,例如Vim regexp中的'gc'標誌。只是使用'sed -i'似乎對我有點危險。 – nab 2012-03-02 22:44:11

+0

如果您要查看所有更改,請使用sed,然後檢查生成的差異。 – 2012-03-02 22:45:01

回答

6
find projectfolder -type f -exec grep -Iq 'pattern' {} \; -exec vim {} + 
+0

這個解決方案存在一個小問題:'Vim:警告:輸入不是來自終端,這會導致vim退出後發生故障。原因是xargs在標準輸入不是用戶終端的環境中運行其參數命令。所以我會建議一些形式:'find projectfolder -type f -exec grep -Iq'pattern'{} \; -print | xargs sh -c' nab 2012-03-03 10:10:30

+0

@nab好點。經過一些測試後,我發現(至少對我來說)改變'-print0 | xargs ...'到'-exec ... +'工作。這實際上是有道理的,單靠'find'不會讀取stdin,所以它的孩子可以。這是我見過的兩個人之間的第一個功能區別。 – Kevin 2012-03-04 21:14:47

3

這裏是我如何做到這一點(當我不使用perl):

find . -name '*.java' -exec vim +'%s/OldName/NewName/gc' +'wq' {} \; 

如更換 「OLDNAME」 與 「新名稱」 中的所有 「*的.java」 文件,但提示我爲每個替代確認。

+0

謝謝!你如何在使用Perl時做到這一點? – nab 2012-03-04 20:21:14

+0

'find。 -name'* .java'-exec perl -i.BAK -wpe's/OldName/NewName/g'{} \;'用「.BAK」擴展名保存舊文件,然後您可以使用' diff'。 – Manish 2012-03-04 20:31:26