2013年11月13日 星期三

vim "取代" 指令

以前在學校,提到 VI / VIM 時,老師總會說它是個強大的編輯器。其實當時只覺得它很難用(那時用的版本還是用H、J、K、L在移動游標),不知道它強大在哪?現在跟視窗化的編輯器比起來,我想是沒有強大到哪去啦,除了它可以不需要滑鼠。不過就 command line 下,它的確是具備了不少後來視窗界面下才被覺得習以為常的功能。


像是「取代」- 在文件中找到特定的字串,然後把它代換成另一個字串。
只是它的指令比較複雜一點,我常常會忘記。

:1,$s/pattern1/pattern2/g

這表示從第 1 行到最後一行都把 pattern1 換成 pattern2,而且是同一行中不管有幾個 pattern1 都換掉。
1,$ 表示要取代的範圍,這表示從第一行到最後一行,如果是整個文件的話,可以用 % 簡化。
s 是取代指令
g 則是表示同一行中,每一個 pattern1 都要被換掉,如果沒有這個參數,只有第一個會被換掉。
用%表示整篇文章時,指令就會變成

:%s/pattern1/pattern2/g

或者用 "." 來表示現在所在的這行

:.,$s/pattern1/pattern2/g

另外,也是可以反向表示範圍

:.,1s/pattern1/pattern2/g

只是 VIM 會跟你確認是不是打錯了? Backwards range given, OK to swap (y/n)?

最後的 g 這個部份,除了 g 之外,還有 i 跟 c 可以用。i 表示不分大小寫,c 表示每個取代都要確認。
         (y/n/a/q/l/^E/^Y)?

  • y 是代表執行目前的取代。
  • n 是跳過。
  • a 代表 always ,就是從目前以後的取代都會執行。
  • q 則是不要作取代,並且離開詢問要不要取代的狀態,並回到指令模式或原來的模式下。
  • l 則是 last 的意思,就是目前這個取代執行後就離開詢問的取代模式,回到指令模式或原來的模式下。
  • ^E 表示往前一頁。
  • ^Y 表示往後一頁。


另外因為 pattern 的部份支援 Regular Expression ,所以變化還蠻多的
例如:1,$s/^...//g 會把每一列開頭的三個字元刪除。

詳情可以參考:Vi 或在 VI/VIM 中下 :h:s 指令(:s 的 help)

沒有留言:

張貼留言