1 vim
假定你有個變量名為 "x_cnt" 而你要把他改為 "x_counter"。這個變量在多個 C 文件都被用到了。你需要在所有文件中作此改動。你得這么做。把所有相關文件放進參數列表:[:args *.c]。這個命令會找到所有的 C 文件並編輯其中的第一個。現在你可以對所有這些文件執行置換命令::argdo %s/\<x_cnt\>/x_counter/ge | update
命令 ":argdo" 把另一個命令當作其參數。而后者將對參數列表內所有的文件執行。作為參數的替換命令 "%s" 作用於所有文本行。它用 "\<x_cnt\>" 來查找"x_cnt"。
"\<" 和 "\>" 用來指定僅匹配那些完整的詞,而不是 "px_cnt" 或"x_cnt2"。替換命令的標記中包含 "g",用以置換同一行文本內出現的所有的匹配詞 "x_cnt"。標記 "e" 用於避免因文件中找不到 "x_cnt" 而出現錯誤信息。否則 ":argdo" 命令就會在遇到第一個找不到 "x_cnt" 的文件時中斷。字符 "|" 分隔兩條命令。后面的 "update" 命令將那些有改動的文件存盤。
如果沒有 "x_cnt" 被改成 "x_counter",這個命令什么也不做。還有一個 ":windo" 命令,用於在所有視窗內執行其參數所規定的命令。以及 ":bufdo"命令,對所有緩沖執行其參數所規定的命令。使用中要小心,因為你在緩沖列表中的文件數量可能超過你能想像的。請用 ":buffers" 命令 (或 ":ls") 來檢查緩沖列表。可以在命令行下進行替換,仍然以vi方法中的例子進行講解,把c文件中的"x_cnt" 改為 "x_counter"。
2 perl
可以執行以下命令:
find . -name '*.c' -print0 | xargs -0 perl -pi -e 's/x_cnt/x_counter/g'
xargs 把find命令的結果作為perl的參數。
find的參數-print0和xargs的參數-0是防止文件名中有空格或新行造成錯誤,可以man xargs獲得幫助。
注意: 如果替換的字符包括 ()[]/"'!? 等等這樣的特殊字符,你必須在字符前加上反斜杠\ 。
這種方法的好處是不用啟動編輯器,比較迅速。缺點是容易出現不想要的替換,例如:把px_cnt替換成了px_counter。
3 sed
仍以上面的例子講解:
find . -name "*.c" -print0 | xargs -0 sed -i 's/x_cnt/x_counter/g'
優缺點和perl方法相同。
以上方法的差異只在於使用工具的不同,相信肯定還有別的工具能辦到這件事。
比如emacs,肯定也能做到這些,只是因為我不用emacs,所以不熟悉。
希望大家總結自己得心應手的方法。