今天我和布丁長輩還有DK長輩聊天的時候就講到一個問題:我可不可以知道到底這份文件有多少個我想要搜尋的字串?
當然啦,你如果會 vim 的全域指令你可能可以用 :g/pattern/p 之後,用 copy 的方式或是其他指令的組合把比對出來的東西存到另外一個檔案去,然後再用其他的工具(像是wc)計算行數。不過,這個方法,不夠方便。
比較辛苦一點的方式也可以用 /pattern 然後自己按 n 一個個算,不過… 我想可能會先算到瘋掉。
難道 vim 就只能這樣了嗎?
忘了是DK長輩還是布丁長輩說可以寫程式來算。不過 vim 的 script 寫法,我打算到後面再寫。我心裡想的是,應該有一行就可以解決的方法啊!
在 vim 裡面遇到問題的時候有兩個方式,第一個就是 :h 然後後面跟上你猜可能會有答案的關鍵字。不過這個方式我今天用了好幾次,感覺除了寫程式別無他途。可是,我就是不想寫程式。第二個方法就是到 www.vim.org 上找 tips 看,結果沒兩下就找到了這篇<Tip #860: count number of matches of a pattern>,後面的 comment 中有個人只用一行解決,看了就覺得「哎唷,怎麽就是沒想到呢?」其實用 vim 編輯文件想這些怎麽樣可以讓自己少打點或是只用一行指令解決的過程是很有趣的。這個人用的方法很簡單也很漂亮,但卻要用到我們之前提過的取代指令 :s :
:%s/pattern/&/g
& 代表的意思就是用來表示前面比對的字串,所以做這個指令其實對檔案本身並不會有什麽改變。但是由於做的是全域的取代置換, vim 會告訴你有從多少行中多少個字串被取代。輕輕松松很漂亮地用一行命令解決這個問題。
輸入只有一行的命令:
結果就會出現在最後一行上,而且不會改變到檔案本身: