Vi/Vim 能夠說是文本編輯中的一代傳奇人物,直至如今,它仍然在高級程序員的武器庫中佔有一席之地。每一個 Linux 發行版默認都包含Vim ,並且即便你不是 Linux 系統用戶,你也能夠安裝 Vim 。 python
爲何到如今還來說這款古老的軟件?由於它牛逼啊!它包含幾乎全部功能的輕量級鍵盤快捷鍵、內置表達式搜索,以及強大而又穩定的插件生態系統。就連其餘現代文本編輯器功能,如漂亮的語法高亮,它也有。你會在不知不覺中愛上這款文本編輯神器。linux
回到主題,咱們今天就來學習 Vim 中的文本搜索和替換功能,幫助你更好地使用 Vim 這款神器。若是你想學習更多 Vim 操做,能夠在公衆號「良許Linux」後臺回覆「資料」,有我整理的電子書和視頻。程序員
爲了更好的講解後續內容,咱們首先須要準備一個演示文件。在這裏,我生成了一個包含系統上全部已安裝軟件包的文本文件 PackageList.txt
來做爲演示文件。面試
cat PackageList.txt複製代碼
如今,咱們在 Vim 中打開這個文本文件。以後,咱們就在這個文件裏進行後續的操做演示。vim
vim PackageList.txt複製代碼
在 Windows 下,不少軟件的搜索功能可使用 ctrl+F 組合鍵調出搜索框,而後完成後續的搜索。但在 Vim 裏,咱們須要使用如下命令結構實現搜索功能:markdown
?<search_string>複製代碼
例如,咱們想要在 PackageList.txt 文件裏搜索 python
這個關鍵詞,能夠這樣操做:編輯器
?python複製代碼
默認狀況下,搜索會定位到一個離當前光標最近的一個匹配結果。若是咱們想要轉到下一個/上一個搜索結果,請使用如下按鍵:函數
注意:在使用上述按鍵以前,請不要忘記按 Enter
鍵。不然,搜索詞將會被改變!oop
上面的只是 Vim 下搜索的基本功能,若是你認爲這是它的所有搜索功能,那真是圖樣圖森破。接下來,咱們來嘗試一下更強大的搜索功能。學習
先給出搜索格式:
/\<search_string>/>複製代碼
這裏,\<
表示字符串開始,/>
表示字符串結束,中間的就是須要搜索的字符串表達式。
與前面的示例同樣,使用 n
或 N
來導航搜索結果。
中間的字符串表達式,不只支持直接輸入關鍵詞,還支持使用通配符。例如,咱們要搜索以 python-
開頭的字符串,可使用 python*
。這裏 *
表示匹配任意字符。
/\<python*/>複製代碼
搜索結束後,Vim 會默認將光標放在匹配的關鍵詞的起始字符處。
不喜歡光標的默認定位?不要緊,Vim 容許咱們更改光標定位的默認字符位置。
/python/e複製代碼
這裏,e
的做用是將光標定位到匹配關鍵詞的末尾字符。
不只如此,使用如下命令模式,你還能夠將光標定位在搜索結果的下方或上方。
/<search_string>/+2
or
/<search_string>/-3複製代碼
你也能夠從搜索匹配結果的開頭/結尾偏移光標。例如,如下命令將光標定位在開頭旁邊的3個字符處。
/<search_string>/s+3複製代碼
/<search_string>/b+3複製代碼
這裏,s
表示開頭,+3
表示從開頭開始的第 3 個字符。b
也表明開始(begin),它的功能相似於 s
。從截圖中也能夠看出,Vim 會自動將 b
翻譯爲 s
。
若是有興趣從搜索匹配結果的末尾進行偏移,請使用 e
(end)。
/<search_string/e-2複製代碼
下面是對文本文件執行搜索的另外一種很棒的方法。
:%s/<search_pattern>//gn複製代碼
這條命令具體有啥高大上的做用?咱們這裏先賣個關子,請繼續往下讀。若是你想學習更多 Vim 操做,能夠在公衆號「良許Linux」後臺回覆「資料」,有我整理的電子書和視頻。
查找和替換是任意一款文本編輯器的一組常見和必備功能。下面就來說解 Vim 中的字符串替換功能。
Vim 使用如下命令結構實現替換功能。
:<range> s/<search_string>/<replace_string>/<modifier>複製代碼
例如,在 PackageList.txt 文件裏用 Python3
字符串替換全部 python
字符串。
:%s/python/Python3/g複製代碼
簡單吧?咱們再看看下面這條命令。
:%s/python/Python3/gc複製代碼
能夠看出來,它在底部詢問你是否要進行替換操做。這時,你能夠選擇一些操做。那這幾個是表明什麼意思呢?咱們一個個來看。
接下來,咱們來試試範圍這一個域。其實,咱們在前面的例子裏,已經使用了 %
範圍(對整個文件範圍)。
若是咱們不想在整個文件範圍進行查找替換,若是咱們只想在某幾個特定行進行這種操做,須要怎麼作?咱們能夠採用相似於如下命令格式:
:200,250 s/python/Python3/g複製代碼
執行完以上操做,Vim 會將第 200 行開始並在第 250 行結束的全部 python
替換爲 Python3
。
此功能不只限於一個詞,還能夠完成對多個關鍵詞的替換。它的命令格式以下:
:%s/<search_term_1>\|<search_term_2>\|<search_term_3>/<replace_string>/g複製代碼
好比,讓咱們想要將文本中全部 python
和 py
更改成 Python3
。
:%s/python\|py/Python3/g複製代碼
本文前面提到的全部替換操做都是區分大小寫的。例如,Python
,python
,PYTHON
等都是不一樣的。
若是你要忽略大小寫,能夠在搜索字符串後面加上一個 \c
,以下:
/<search_term>\c
:%s/<search_term>\c/<replace_term>/g複製代碼
但這個設置是臨時性的,Vim 關閉以後就會失效。若是你想一勞永逸,也能夠從 vimrc文件
直接設置不區分大小寫。
set ignorecase複製代碼
還有一個有趣的作法:智能大小寫模式。
set smartcase複製代碼
ignorecase
將強制 Vim 忽略大小寫。可是,若是搜索關鍵詞中只要有大寫字母,smartcase
將使 Vim 再次變爲區分大小寫。
注意:若是要啓用 smartcase
,首先須要設置 ignorecase
。
Vim 能夠幫助你作不少事情,多加耐心地練習,相信你會愈來愈喜好這款古老的神器。