vim doc: usr_27.txt 查找命令及模式
一、使用正則表達式的命令[/,?, s, g]
實踐用法:
1, 模式塊作為替換的內容
1~多個#序列后面加上空格
:%s/\(#\+\)/\1 /g
1. 搜索命令
使用正則表達式的命令最常見的就是/
, ?
(搜索)命令。其格式如下:
/ 正則表達式, 向下搜索
?正則表達式,向上搜索
如:
/\d\d:\d\d:\d\d
" 查找如 17:37:01 格式的時間字符串
2. 替換命令s
命令的完整形式: [range]s/from/to/[flags]
把from指定的字符串替換成to指定的字符串,from可以是正則表達式。
[range]的取值列表:
符號 | 說明 |
---|---|
不寫range | 默認為光標所在的行。 |
% | 所有行(與 1,$ 等價) |
. | 光標所在的行。 |
1 | 第一行。 |
$ | 最后一行。 |
33 | 第33行。 |
'a | 標記a所在的行(之前要使用ma做過標記)。 |
.+1 | 當前光標所在行的下面一行。 |
$-1 | 倒數第二行。(這里說明我們可以對某一行加減某個數值來取得相對的行)。 |
22,33 | 第22~33行。 |
.,$ | 當前行 到 最后一行。 |
'a,'b | 標記a所在的行 到 標記b所在的行。 |
注意,上面的所有用於range的表示方法都可以通過 +、- 操作來設置相對偏移量。
[flags]
這里可用的flags有:
符號 | 說明 |
---|---|
無 | 只對指定范圍內的第一個匹配項進行替換。 |
g | 對指定范圍內的所有匹配項進行替換。 |
c | 在替換前請求用戶確認。 |
e | 忽略執行過程中的錯誤。 |
查看匹配yes單詞的數量:
:%s/yes//gn
注意:上面的所有flags都可以組合起來使用,比如 gc 表示對指定范圍內的
所有匹配項進行替換,並且在每一次替換之前都會請用戶確認。
例如對全文替換,且替換前請求確認
:%s/from/to/gc
將所有的four替換成4,但是fourteen中的four不替換
:s/\<four\>/4/g
:%s/ */ /g 把一個或者多個空格替換為一個空格。
:%s/ *$// 去掉行尾的所有空格。
:%s/^/ / 在每一行頭上加入一個空格。
3. global 命令形式
global命令格式 : [range]global/{pattern}/{command}
global命令在[range]
指定的文本范圍內(缺省為整個文件)查找{pattern}
可以是正則表達式,
然后對匹配到的行執行命令{command}
,如果希望對沒匹配上的行執行命令,則使用global!或vglobal命令。
一些例子:
1) 刪除包含某字段(例如aaa)的行
:g/aaa/d
2) 刪除不包含某字段(例如aaa)的行
:g!/aaa/d
3) 刪除指定的行
:x,.d
#從x行刪除到當前行;
:.,xd
#從當前行刪除到x行;
4) 刪除只有空白的行
:g/^\s*$/d
二、正則表達式的用法
表示位置的符號
元字符 | 說明 |
---|---|
$ | 匹配行尾 |
^ | 匹配行首 |
< | 匹配單詞詞首 |
> | 匹配單詞詞尾 |
表示數量的元字符
元字符 | 說明 |
---|---|
* | 匹配0到任意個 |
+ | 匹配1到任意個 |
? | 匹配0或1個 |
{n,m} | 匹配n-m個 |
{n} | 匹配n個 |
{n,} | 匹配n-任意個 |
{,m} | 匹配0-m個 |
元字符一覽
元字符 | 說明 |
---|---|
. | 匹配任意一個字符 |
[abc] | 匹配方括號中的任意一個字符。可以使用-表示字符范圍, |
[a-z0-9] | 匹 配小寫字母和阿拉伯數字。 |
[^abc] | 在方括號內開頭使用^符號,表示匹配除方括號中字符之外的任意字符。 |
\d | 匹配阿拉伯數字,等同於[0-9]。 |
\D | 匹配阿拉伯數字之外的任意字符,等同於[^0-9]。 |
\x | 匹配十六進制數字,等同於[0-9A-Fa-f]。 |
\X | 匹配十六進制數字之外的任意字符,等同於[^0-9A-Fa-f]。 |
\w | 匹配單詞字母,等同於[0-9A-Za-z_]。 |
\W | 匹配單詞字母之外的任意字符,等同於[^0-9A-Za-z_]。 |
\t | 匹配
|
\s | 匹配空白字符,等同於[ \t],或[ ]。 |
\S | 匹配非空白字符,等同於[^ \t]。 |
另外,如果要查找字符 *、.、/等,它們不在方括號之內時,則需要在前面用 \
符號,表示這不是元字符,而只是普通字符而已。
元字符 | 說明 |
---|---|
* | 匹配 * 字符。 |
. | 匹配 . 字符。 |
/ | 匹配 / 字符。 |
\ | 匹配 \ 字符。 |
[ | 匹配 [ 字符。 |
方括號內的特殊字符
鍵盤上的特殊字符放到方括號中基本都能直接匹配
[!@#$%^&*()_+-=[]\{}|:";'<>?,./~]
例外的情況需要加\
的有 -
,\
.
中划線如果與數字,字母,空格相鄰時,又希望它匹配文中的-,就加轉意字符
有些情況反斜杠也要加,為了通用性考慮,如果為了匹配 - \ 就使用 [ \- \\]
方括號的用法:
方括號后加* 或+ 匹配任意多個 或 1個以上括號內的任意字符
例如 [a-zA-Z0-9]*
匹配任意多個字母數字組成的字符串。