行內搜索
行內搜索,也就是在當前行內進行搜索和移動,通常都與編輯命令一起使用。
- fx -- 移動到下一個字符x的位置,光標停留在x字符上面
- tx -- 移動到下一個字符x的位置,光標停留在x前一個字符上
- Fx -- 移動到前一個字符x的位置,光標停留在x字符上面
- Tx -- 移動到前一個字符x的位置,光標停留在x后一個字符上
- ; -- 重復前一個搜索,向著同一方向,即原來向前就向前,原來向后就向后
- , -- 重復前一個搜索,向著反方向
行內搜索通常與編輯一起使用:
- dfx/dtx -- 刪除到下一個字符x
- yfx/ytx -- 復制到下一個字符x
全局搜索
搜索,分為二個部分:一個是搜索命令,另一個是模式匹配;搜索命令就是各個編輯器所支持的啟動搜索的方式,比如Windows的各種編輯器都是以對話框的形式。模式就是在對話框中輸入的要匹配的字串集。本身字串的匹配功能有限,所以就有了專門用于模式匹配的正則表達式,它描述了模式匹配的一些規(guī)則,使用這些規(guī)則可以讓匹配更加的強大和精準,多數(shù)編輯器都支持正則表達式,Vim也不例外,先講一下搜索命令,然后再講對正則表達式的支持。
基本搜索命令
- /pattern -- 向前搜索pattern,光標停留在第一個匹配的第一個字符上面。向前的意思是向下,或者向著行數(shù)增加的方向。Vim會亮顯示所有的匹配,并將光標停留在當前位置的下一個匹配的首字符上
- / -- 當不提供pattern時,會向前重復搜索上一個pattern,也就是向前重復搜索的意思,光標會跳到下一個匹配上面
- ?pattern -- 與/pattern類似,只不過它是向后搜索,向著行數(shù)減少的方向。
- ? -- 與/類似,是不過是向后重復搜索
- n -- 向著同一方向重復搜索,原來向前就繼續(xù)向前,原來向后就繼續(xù)向后(當向前搜索時與/一樣,當向后搜索時與?一樣)
- N -- 向著反方向重復搜索,原來向前就向后,原來向后就向前(向前時?一樣,向后時/一樣)
- * -- 向前搜索光標所在的單詞,只匹配整個單詞,單詞的定義是一串連續(xù)的字母,數(shù)字,標點,空白都是單詞的分隔符。
- # -- 向后搜索光標所在的單詞,只匹配整個單詞
- /?+上下方向鍵 -- 像其他的命令提示符一樣,方向鍵可以方便的引用歷史搜索記錄如,搜索記錄為error, grape, that,那么按了/后,再按向上方向鍵:/that,再向上:/grape,向下:/that,再次按回車就可以搜索了。
正則表達式
如前提及,模式匹配在搜索當中有重要的作用。正則表達式(Regular Expression)是專門用于描述搜索中的(Pattern)模式的。使用正則表達式來構建pattern可以讓搜索更加強大和精準。有關正則表達式的詳細內容可以參閱《Mastering Regular Expression》這本書。正則表達式僅是一種規(guī)范,但是各種常用的工具和編程語言都對正則表達式有不同程度的支持。正則表達式有二類:一是正常的字符,僅匹配自身,如"that",只能匹配"that";另一類就是具有特殊意義的元字符。不像基本字符,元字符具有特殊的含義,如.(句點)可以匹配任意除換行符外的單個字符。正則表達式就是學習各種元字符的使用。
Vim對正則表達式有很好的支持,它的常用元字符有:
通用匹配:
- . -- 匹配任何除換行符外的單個字符
- \s -- 匹配一個空白符(space或tab)
- \S -- 一個非空白符
- ^ -- 僅匹配行首,也即必須以模式開頭
- $ -- 僅匹配行尾,也即必須以模式結尾
- \< -- 匹配詞首,單詞定義為一連串的字母,標點空白和數(shù)字均視為分隔符
- \> -- 匹配詞尾。
- \<...\> -- 匹配整個單詞(前面命令中的*和#就是用這個來只匹配單詞)。當然\<和\>不必一起使用,可以分開使用
限量符:
- * -- 前一個字符出現(xiàn)0次或多次,如a*,可以匹配'', 'a', 'aa'或'aaa'等
- \+ -- 前一個字符出現(xiàn)1次或多次
- \= -- 前一個字符出現(xiàn)0次或1次
- \{n,m} -- 前一個字符出現(xiàn)n到m,如a\{3,5},則可以匹配'aaa', 'aaaa'或'aaaaa'
- \{n} -- 前一個字符出現(xiàn)n次
- \{n,} -- 前一個字符出現(xiàn)n次到最多次數(shù)(32000)
- \{} -- 0次或多次,與*一致
操作符:
- \| -- 或,如ab\|ba,則匹配'ab'或'ba'
其他:
-
[...] -- 字符集,表達一組字符的集合,匹配其中任何一個字符
如[abc],則匹配a或b或c。連續(xù)的字符可以用-代替如,[a-c]則匹配a或b或c,[0-9]匹配0到9中任何一個數(shù)字,[a-zA-Z]匹配任何一個字母。通常與限量符一起使用,如:/[a-z]\{3,6},長度3到6的小寫字串,/[0-9]\{2,4}長度2到4的數(shù)字。
- \(...\) -- 組合,把內部看成一個整體并保存起來以便后續(xù)引用。本身作用不大,要與其他元字符一起使用才能發(fā)揮其功效
-
\n -- 其中n=1~9,對組合的引用,也即引用\(...\)中所匹配的內容
如,/\(that\)\1,則匹配thatthat;/\([a-z]\).\1則匹配,aba, aoa, bcb等。
全局替換
替換也是編輯器中一個必不可少的功能,Vim對于替換也提供了強大的支持。
命令格式
:[range]s/pattern/replacement/[options]
把[range]所指的范圍內的pattern替換為replacement
詳解
-
range -- 可選。如果缺省就指當前行,也就是后面的命令僅對當前行有效
指定方式:n,m -- 從第n行到第m行,包括第n行和第m行。其中.代表當前行; $代表最后一行; %表示全局,等同于1,$
-
options -- 可選,缺省時只替換一行中的第一個匹配
常用:g -- 把一行中的所有匹配都替換;c -- 替換之前要求確認
示例:
- :s/old/new -- 當前行中的第一個old替換為new
- :s/old/new/g -- 當前行中的所有old替換為new
- :s/old/new/gc -- 當前行中的所有old替換為new,每一個替換之前要求確認
- :5,20s/old/new/gc -- 5到20行中的所有old替換為new,每一個替換之前要求確認
- :.,20s/old/new/g -- 當前行到20行中的所有old替換為new
- :.,$s/old/new/gc -- 當前行到最后一行中的所有old替換為new
- :%s/old/new/gc -- 全局替換,文檔中所有的old替換為new
根據(jù)條件替換
前面的替換方式是以行的方式指定具體的范圍,也可以以另外一種方式指定范圍:
:g/pattern/s/old/new/gc
全局查找pattern,對于匹配pattern的行進行后面的替換,這里的pattern和old都可以使用正則表達式,但是replacement是不能使用正則表達式的,對于replacement,它有自己專屬的規(guī)則。
replacement中的規(guī)則
-
>\n n = 1~9 -- 引用pattern中的組合\(...\)。
最常用的方式就是調換二個詞的順序或者用于重復輸入,如:
- :s/\(that\), \(what\)/\2, \1 -- that, that被換成what, that
-
& -- 替換為模式的匹配,也即如果pattern匹配that,那么&就是that
咋一聽貌似這個沒啥用處,如:s/that/&/gc,這與未替換之前是一樣的。它也常用于重復輸入,如:
- :s/that/&,&,what/gc -- that替換成that, that, what
- :s/.*/{&}/g -- 把當前行用{}括起來
-
~ -- 替換為上一次替換命令所用的replacement,而pattern不必相同,也多用于重復編輯
如:
- :s/their/our/g -- their --> our
- :s/his/~/g -- his --> our
- :s/my/~/g -- my --> our
-
\u或\l -- 把接下來下一個字母轉成大寫或小寫
如::s/that/\uthat/g -- that --> That; :s/That\lThat/g -- That --> that。這多少顯得有些弱智,直接拼大寫或小寫更方便。
這二個多用于變量,如:
- :s/\(what\)/\u\1/g -- what --> What;
- :s/\(.*\)/\u&/g 行首大寫;
- :s/\([a-zA-Z]\+\)/\u&/g 每個單詞都Captalization
-
\U或\L和\e或\E -- 把replacement中的從\U或\L到\e或\E的所有字母都轉成大寫或小寫,如::s/restore/re\Usto\ere/ -- restore --> reSTOre,這也很弱智。
還是與變量才更強大:
- :s/restore/\U&/g -- restore --> RESTORE;
- :s/ResTore/\L&/g -- ResTore --> restore
替換中的技巧
Vim中的搜索和替換博大精深,要想掌握好唯有不斷的練習與實踐,這些講的僅是一個開端。
億恩-天使(QQ:530997) 電話 037160135991 服務器租用,托管歡迎咨詢。 本文出自:億恩科技【mszdt.com】
服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]
|