vi一般分为三种状态:命令模式、插入模式、底行模式
- 命令行模式(command mode)
控制光标的移动,字符、字或行的删除 - 插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。 - 底行模式(last line mode)
文件保存或退出vi,也可以设置编辑环境,如查询关键字、列出行号(set number)
注:其中「ESC」键进行模式切换,一般归纳为插入模式和命令模式(底行模式也纳入命令模式)切换
进入vi的命令:
vi filename
:打开或新建文件,光标在第一行首vi +n filename
:编辑打开文件,光标在第n行首vi + filename
:编辑打开文件,光标在最后一行首vi +/error filename
:打开文件,并将光标置于第一个与error匹配的字符处vi -r filename
:之前用vi编辑时发生系统崩溃,恢复filenamevi filename1 filename2
:打开多个文件,依次进行编辑
移动光标命令(都是在命令行模式下进行的):
k(Ctrl+p)、j(Ctrl+n、Enter 键)、h(backspace)、l (space)
:光标上、下、左、右移动命令w或W
光标右移一个字至下一个字首e或E
光标右移一个字至字尾b或B
光标左移一个字或一个单词至字首( { 、 ) }
光标移至段落开头、段落结尾$
光标移到到当前行行尾n$
光标移至第n行尾0
光标移至当前行行首 (是数字0)Ctrl+F
翻下一页Ctrl+B
翻上一页nG
跳转命令,n为行数,使光标跳到指定行G
光标到最后一行Ctrl+g/G
列出光标所在位置的行数和列数:set number
在文本前列出所在行号
编辑命令:
i I
在光标当前字符前、光标当前行首插入文本a A
在光标当前字符后、光标当前行末插入文本o O
在光标当前行后面、当前行前面插入一行空行dd
删除光标所在那一行x
删除光标所在的那个字符d$
删除光标所在处到行尾的字符:10,100d
删除文件10至100行的内容r
替换一个字符 按住r 后 按替换的字符 光标所在字符就替换了cw
删除光标所在单词,替换新的单词/string、?string
光标所在处向后查找相应的字符串:r test.sh
vi file 在打开的文件file光标所在处读入test.sh(也可以在指定的行号后读入文件内容, 例如6r test.sh
从文件的第6行开始读入test.sh):w /tmp/1
vi file后发现没有写权限,保存修改到临时文件/tmp/1:20,60w /tmp/2
把vi file的第20~60行之间的内容另存成文件/tmp/2:wq
保存文件 退出:q!
不保存 直接退出
注:其中的:号都是英文状态下的
编辑文件 行首或行尾添加字符串或替换字符串:
:1,$s/^/ 222 /
文件的第一行至最后一行的行首插入222:%s/$/222/g
文件每行行尾添加222:%s/:.*//g
将所有行:号后面到行尾部分替换为空 即删除后面部分:%s/string1/string2/g
编辑文件将所有string1替换成string2:3,7s/string1/string2/
文件中的第3行到第7行中string1替换成string2:%s#/usr/bin#/bin#g
和:%s//usr/bin//bin/g
将文件中所有/usr/bin 替换成/bin
注:其中s为substitute,%表示所有行,g表示global
同时编辑2个文件,拷贝一个文件中的文本并粘贴到另一个文件中:
vi file1 file2
yy
在文件1的光标处拷贝所在行
:n
切换到文件2 (n即next)
p
在文件2的光标所在处粘贴所拷贝的行 最后保存退出即可
more test.sh | grep -v ^$ | grep -v ^#
查看去掉所有空行和以#开始的注释行 的内容