本文介紹如何使用Vim的搜索模式。
搜索單詞
Vim中使用 \< 和 \> 分別表示單詞的開頭和結尾,例如查找單詞 i 而不是字母 i ,在正常模式下,按下 / 啟動搜索模式,輸入 \<i\> ,敲擊回車即可。
要查找當前光標覆蓋的單詞,敲擊 * ,Vim會自動啟動搜索模式,光標移動到該單詞下一個現身位置。
搜索當前單詞並連續修改
假定當前光標覆蓋的單詞為 foo,按下 * 鍵,Vim 會搜索並跳轉到下一個 foo 的位置,按下 ciw 組合鍵,意思是 change inner word ,此時 foo 會被刪除,在原位置輸入 bar ,然后按下 Escape 鍵。這就完成了一次搜索並修改,接下來按 n 鍵繼續搜索,如果還需要修改,則按下 . 鍵表示重復修改動作,如此反復完成連續搜索與修改。
搜索連續重復單詞
有時你可能會連續重復輸入同一個單詞而不自知,例如以下文本:
1 hello hello 2 world world 3 thank 4 thank
搜索模式:
\(\<\w\+\>\)\_s*\1
以上搜索模式會匹配文本中的1-4行。在Vim中,使用 \( 和 \) 包括的部分視為一個原子,其中 \(\<\w\+\>\) 匹配一個單詞原子,\s 匹配空格符和tab符, \_s 匹配空格符、tab符和換行符, \_s* 匹配0次或多次。
搜索A或B
使用 \| 表示或邏輯,例如 red\|green\|blue 匹配字符串(注意不是單詞)red或green或blue。
如果要將匹配的對象替換成新的字符串,可以使用 :%s/搜索正則/新字符串/g,例如將所有的red或green字符串替換為purple:
:%s/red\|green/purple/g
替換所有單詞red或green為單詞purple:
:%s/\<\(red\|green\)\>/purple/g
Vim具有搜索模式記憶,因此以上命令也可以拆解為兩步:
第一步:搜索單詞red或green:
/\<\(red\|green\)\>
第二步:將搜索結果替換為purple:
:%s//purple/g
替換命令中搜索正則為空時,Vim會直接使用最后一次使用過的搜索正則作為默認表達式。
有時我們並不想替換結果,而是想要對結果做一些裝點,那么可以使用 & 來引用搜索結果,例如以下示例會將文本中所有的單詞red或green添加上引號:
:%s/\<\(red\|green\)\>/"&"/g
或者使用分組 \1, \2, \3 ... 來引用搜索結果:
:%s/\<\(red\|green\)\>/"\1"/g
- 搜索與替換
:substitute 命令搜索一個字符串並將其替換為新字符串,以下為一些基本使用方法。
:%s/foo/bar/g
全文搜索每個foo並替換為bar。
:s/foo/bar/g
當前行搜索每個foo並替換為bar。
:%s/foo/bar/gc
全文搜索每個foo並替換為bar,替換前需要確認。
:%s/\<foo\>/bar/gc
全文搜索每個單詞foo並替換為bar,替換前需要確認。
:%s/foo/bar/gci
全文搜索每個foo並替換為bar,替換前需要確認,大小寫不敏感。
:%s/foo/bar/gcI
全文搜索每個foo並替換為bar,替換前需要確認,大小寫敏感。
標記g:表示全局搜索,對每一個匹配結果進行操作,缺省標記g,則只對第一個匹配結果進行操作。
標記c:表示操作前需要進行確認。
標記i:表示大小寫不敏感。
標記I:表示大小寫敏感。
- 搜索分組
使用 \( 和 \) 包圍住表達式使其成為一個原子,並根據原子所處位置順序使用\1,\2,……來引用相應的匹配結果。最常見的場景莫過於對調字符串位置,例如:
原文:
1. France VS Germany
命令: :s/\(France\)\(\sVS\s\)\(Germany\)/\3\2\1
結果: 1. Germany VS France
搜索A與B
使用 \& 表示與邏輯,例如搜索同時包含了 red 和 blue 的行。進行與邏輯搜索時,Vim按照由 \& 分隔的表達式順序逐一匹配,因此如果開啟了高亮匹配結果的功能,那么你看到高亮匹配的永遠都是最后一個表達式的匹配結果。
/.*red\&.*blue
反向肯定預查搜索
使用 \(expression1\)\@<=expression2 表示反向肯定預查搜索模式,其過程為首先搜索 \@<= 右側的原子即 expression2,遇到匹配項后再檢查匹配結果左側是否滿足 expression1。例如以下命令會搜索多個冗余0的數字。
原文: 1.0 1.000 1.0100 命令: \(\.\d\+\)\@<=0\+\> 結果: 匹配了1.000后兩個0,1.0100后兩個0。