VIM(vi)编辑中需要搜索或定位特定的单词或单词的一部分。vi 编辑器有向前或向后搜索指定模式的功能。文本替换操作需要使用末行模式进行操作,即所有文本替换操作命令均以':'开头。本文主要介绍Linux Vim(vi)编辑器中查找和替换的使用。

1、查找搜索

使用Vim(vi) 文本编辑器可以高效的进行文本内容的查找,可以使用行内查找或全文查找,具体如下:

1)行内搜索

行内搜索主要是单个字符搜索查找,可以用来快速移动光标的位置。

命令

说明

f

可以进行行内搜索。

输入fb可以找到下一个b字符。

F

可以在反方向进行行内搜索,

输入Fb可以找到上一个b字符。

t

也可以行内搜索,但是光标停留在符合条件的字符的前面。


输入tb使光标停留在下一个b字符的前面。

T

可以在反方向行内搜索,


但是光标停留在符合条件的字符的下一个字符上。


输入Tb使光标停留在上一个b的后面的字符上。

%

可以搜索与之匹配的对应的()[]{}。对于程序员写代码很有用。

2)全文搜索

/是VIM(vi)编辑器的模式搜索命令。键入/后屏幕的底部会出现一行,同时一个斜扛会出现在底行的行首上,且光标被放置在斜扛之后。此时,可以在光标位置键入你需要搜索的模式。输入完成并按下ENTER键后,编辑器将开始从光标所在的位置起向文件尾部搜索你键入的模式。如果输入的模式被找到,光标将停留在找到的模式上,在找到一个匹配的模式后,如还需要搜索下一个匹配的模式,使用命令n即可,如需找到上一个匹配的模式,则使用N命令即可。

此外 ? 命令也是模式搜索命令。与/的区别在于:/是从光标当前所在位置向文件尾部搜索,而?命令则是由光标当前所在位置向文件头部搜索。

注意:要在Vim中运行命令,须处于正常模式,要从其他任何模式返回正常模式,只需按Esc键。

2、查找替换

使VIM(vi)编辑器对一个文本中有大量相同内容批量替换时,可以通过正则表达式灵活的查找替换指定内容。虽然需要会正则表达式的相关内容,但对于程序员还是很好用的功能。在Vim中,可以使用:substitute (:s)命令查找和替换文本。

命令格式如下:

:[range]s/{pattern}/{string}/[flags] [count]

选项说明:

选项

说明

range

指的是范围,如1,7 指从第一行至第七行,

1,$ 指从第一行至最后一行,也就是整篇文章,

也可以 % 代表。 % 是目前编辑的文章,

# 是前一次编辑的文章。

pattern

就是要被替换的字串,可以用正则表达式来表示。

string

将 pattern 由 string 所替换。

c

confirm,每次替换前询问。

e

不显示 error。

g

不询问,整行替换

i

ignore 不分大小写。

例如,

1)当前行中搜索字符串cjavapy的第一个匹配项并将其替换为levi

:s/cjavapy/levi/

2)使用g替换当前行中所有匹配字符串

:s/cjavapy/levi/g

3)使用%替换全文中所有匹配字符串并区分大小写

:%s/cjavapy/levi/gi

4)如果省略{string}部分相当于删除匹配字符串

:s/cjavapy//g

5)除斜杠(/)外也可用其他任何非字母数字的单字节字符作为分隔符

:s|cjavapy|levi|

注意:当在搜索模式或替换字符串中包含/字符时,此选项很有用。

6)使用c标志需要确认替换

:s/cjavapy/levi/gc

注意:按y替换匹配项,或按l替换匹配项并退出,按n跳过,按qEsc退出替换,使用a选项替换匹配项和所有其余匹配项,若要向下滚动屏幕,可以使用CTRL+Y,向上滚动,可以使用CTRL+E

7)要搜索整个单词,需要键入\>标记单词的开头,键入\>标记单词的结尾

:s/\<cjavapy\>/levi/

8)注释行(在行前添加#)从10到20

:10,20s/^/#/

9)取消注释行从10到20

:10,20s/^#//

10)删除每行末尾的空格

:%s/\s\+$//e

3、使用正则表达式替换

1)元字符

元字符

说明

.

匹配任意字符

[abc]

匹配方括号中的任意一个字符,可用-表示字符范围。如[a-z0-9]匹配小写字母和数字

[^abc]

匹配除方括号中字符之外的任意字符

\d

匹配阿拉伯数字,等同于[0-9]

\D

匹配阿拉伯数字之外的任意字符,等同于[^0-9]

\x

匹配十六进制数字,等同于[0-9A-Fa-f]

\X

匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]

\l

匹配[a-z]

\L

匹配[^a-z]

\u

匹配[A-Z]

\U

匹配[^A-Z]

\w

匹配单词字母,等同于[0-9A-Za-z_]

\W

匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]

\t

匹配<TAB>字符

\s

匹配空白字符,等同于[\t]

\S

匹配非空白字符,等同于[^\t]

\*

匹配* 字符

.

匹配. 字符

\/

匹配 / 字符

\

匹配 \ 字符

\[

匹配 [ 字符

\]

匹配 ] 字符

*

匹配0-任意个

\+

匹配1-任意个

\?

匹配0-1个

\{n,m}

匹配n-m个

\{n}

匹配n个

\{n,}

匹配n-任意个

\{,m}

匹配0-m个

$

匹配行尾

^

匹配行首

\<

匹配单词词首

\>

匹配单词词尾

2)分组替换

在正则式中以\(和\)括起来的正则表达式,之后替换时可以用\1、\2等变量来访问\(和\)中的内容。若将 data1 data2 修改为 data2 data1 。

例如, 

:s/\(\w\+\)\s\+\(\w\+\)/\2\t\1                            "

3)删除行尾空格

:%s/\s+$//g

4)删除行首多余空格

:%s/^\s*//

5)删除沒有內容的空行

:%s/^$//

6)删除包含有空格组成的空行

:%s/^\s*$//

7)删除以空格或TAB开头到结尾的空行

:%s/^[ |\t]*$//