記性不好,才一段時(shí)間不用發(fā)現(xiàn)vim 的東西忘的差不多了。要重新熟悉才行。現(xiàn)從正則表達(dá)式開始,用慣了Java 和Python 的正則表達(dá)式,再用Linux 的正則表達(dá)式還真有點(diǎn)不習(xí)慣,而且grep 和vim 的正則表達(dá)式有些微區(qū)別,grep 和egrep 的正則表達(dá)式也有一點(diǎn)區(qū)別。用用之前要好好想想才行,太惡心了。
今天現(xiàn)把VIM 的正則表達(dá)式整理一些,過幾天整理grep 的。(補(bǔ)充:grep的正則表達(dá)式在元字符方面和vi差不多,不整理了)
vim 的正則表達(dá)式的有兩種模式,magic 和nomagic ,兩種模式下,元字符是不一樣的。可以通過set mogic 和set nomagic 進(jìn)行選擇,默認(rèn)是magic 。建議不要亂設(shè)置,就用magic 模式差不多。也可以再Pattern 指定用magic 和nomagic ,這里不廢話了,下面列出常用的magic 的表達(dá)式。
在vi命令行模式下輸入:
:1, $s/tom/David/g
^ ^ ^ ^ ^
| | | | |---- global 對(duì)全文有效
| | | |
| | |--------- 將tom 替換為 David , 使用正則表達(dá)式.
| |------- 替換單詞
|------ 從文件的第一行到文件的最后一行.
表:
----------------------------------------------------------------------------------------------
元字符 | 功能 | 例子 | 匹配什么
----------------------------------------------------------------------------------------------
^ | 錨定行的開始 | /^love/ | 匹配所有以love開頭的行.
----------------------------------------------------------------------------------------------
$ | 錨定行的結(jié)束 | /love$/ | 匹配所有以love結(jié)束的行.
----------------------------------------------------------------------------------------------
. | 匹配一個(gè)字符 | /l..e/ | 匹配這樣的行, 這些行包含這樣的字符,
| | |第一個(gè)字符是 l,緊跟著兩個(gè)字符,然后是e.
-----------------------------------------------------------------------------------------------
* | 代表0個(gè)或多個(gè)先前字符 | /*love/ | 匹配這樣的行, 有0個(gè)或者多個(gè)空格,空格
| | |候跟著love
-----------------------------------------------------------------------------------------------
[] | 匹配字符組中的一個(gè)字符 | /[lL]ove/ | 匹配所有包含love or Love 的行
-----------------------------------------------------------------------------------------------
[x-y] | 匹配以字符范圍組成的組中的一個(gè)字符 | /[A-Z]ove | 匹配所有這樣的行, 這些行包含如下字符
| | |第一個(gè)字符是從A到Z 中間的一個(gè), 后面跟
| | |著ove
-----------------------------------------------------------------------------------------------
[^] | 匹配一個(gè)不在范圍內(nèi)的字符 | /[^A-Z]ove/ | 匹配所有這樣的行, 這些行包含如下字符
| | |第一個(gè)字符不是從A到Z 中間的一個(gè), 后面
| | |跟著ove
-----------------------------------------------------------------------------------------------
\ | 用來(lái)轉(zhuǎn)義一個(gè)字符 | /love\./ | 匹配所有這樣的行, 這些行包含如下字符
| | |love 后面跟著一個(gè)點(diǎn), 通常點(diǎn)是表示任何
| | |字符的通配符.
-----------------------------------------------------------------------------------------------
\< | 錨定單詞的開始 | /\<love/ | 匹配所有這樣的行, 這些行包含以love
| | |開頭的單詞 (vi & grep 都支持這個(gè)功能)
-----------------------------------------------------------------------------------------------
\> | 錨定單詞的結(jié)束 | /<love\> | ... ^ ... 以love結(jié)束的單詞 ... ^
-----------------------------------------------------------------------------------------------
\(..\) | 標(biāo)記后面用到的匹配字符 | /\(love\)a\1b | 最多可以使用9個(gè)標(biāo)簽. 第一個(gè)標(biāo)簽是模板
| | |最左邊的部分. 在這例子中, 模板love
| | |保存為標(biāo)簽1, 后面的\1指的就是love;
| | |本例子搜索的是這樣的行, 這些行包含這樣
| | |的字符,在lovea 后面跟著loveb.
------------------------------------------------------------------------------------------------
[NOTE: 各種版本的Unix 以及模板匹配 (pattern-matching) 實(shí)用程序并不都是可信賴的, 通常我們使用 vi & grep]
對(duì)前一個(gè)模式的次數(shù)匹配
\* | 0 到多次,盡可能多匹配 |
\+ | 1 到多次,盡可能多匹配 |
\= | 0 到1 次,盡可能多匹配 |
\? | 0 到1 次,盡可能多匹配 |
\{n,m} | n 到m 詞,盡可能多匹配 |
\{n} | n 次,盡可能多匹配 |
\{n,} | 至少n 次,盡可能多匹配 |
\{,m} | 0 到m 次,盡可能多匹配 |
\{} | 0 到多次,盡可能多匹配(和\* 一樣) |
\{-n,m} | n 到m 次,盡可能少匹配 |
\{-n} | n 次 |
\{-n,} | 至少n 次,盡可能少匹配 |
\{-,m} | 至多m 次,盡可能少匹配 |
\{-} | 0 到多次,盡可能少匹配 |
位置匹配
^ | 行開頭 |
\_^ | 行開頭 |
$ | 行末尾 |
\_$ | 行末尾 |
. | 換行之外的任何字符 |
\_. | 單個(gè)字符,包括換行符 |
\< | 單詞開始 |
\> | 單詞結(jié)束 |
\%^ | 文件開頭 |
\%$ | 文件結(jié)束 |
\%V | 可視化區(qū)域內(nèi)部 |
\%# | 光標(biāo)位置 |
\%'m | 標(biāo)記點(diǎn)m,m 可以自己定義的標(biāo)記點(diǎn)( 使用'm) |
\%nl | 匹配第n 行,n 是一個(gè)數(shù)字 |
\%nc | 匹配第n 列,n 是一個(gè)數(shù)字 |
常用預(yù)定義字符
\i | 標(biāo)識(shí)符字符,如字母數(shù)字下劃線等 |
\I | 和\i 相似,但不包括數(shù)字 |
\f | 文件名字符 |
\F | 類似\f ,但不包括數(shù)字 |
\p | 可打印字符 |
\P | 類似\p ,但不包括數(shù)字 |
\s | 空白字符 |
\S | 非空白字符 |
\d | 數(shù)字[0-9] |
\D | 非數(shù)字[^0-9] |
\x | 16 進(jìn)制字符[0-9a-fA-F] |
\X | 非16 進(jìn)制字符 |
\o | 八進(jìn)制字符[0-7] |
\O | 非八進(jìn)制字符 |
\w | 字母[a-zA-Z_0-9] |
\W | 非字母 |
\h | 單詞開頭字符,比\w 少了數(shù)字 |
\H | 非單詞開頭字符 |
\a | 字母表字符[a-zA-Z] |
\A | 非字母表字符 |
\l | 小寫字母 |
\L | 非小寫字母 |
\u | 大寫字母 |
\U | 非大寫字符 |
\_x | X 是上面字符中的一個(gè),\_x 比\x 多匹配一個(gè)換行符 |
\t | <Tab> |
\n | 換行符 |
\1 \2 \3 | 第n 個(gè)捕獲的組\(\) |
其他
\(\) | 組捕獲 |
\%(\) | 非捕獲組,和\(\) 類似,但不捕獲 |
\| | 分支 |
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。