vi编辑器是Linux系统都会内置的文本编辑器,使用广泛。掌握vi编辑器的常见操作是使用Linux必备技能。
vi工作模式
vi包含三种模式,分别是命令模式、插入模式、命令行模式。这三种模式的作用分别是:
命令模式:可以使用上、下左右按键来移动光标,可以删除字符或删除整行来处理文件内容,也可以使用复制、粘贴来处理文件数据。通常vi打开文件就直接进入入一般模式。
插入模式:主要是编辑文件内容。
命令行模式:主要是提供查找字符串、替换字符串、显示行号、保存或取消文件修改等操作。
三种模式有不同的作用,他们是之间的切换关系如下:
命令模式 <-> 插入模式:命令模式下输入i, I, o, O, a, A, r, R等任何一个字母后进入插入模式。按Esc返回命令模式
命令模式 <-> 命令行模式:一把模式下输入:、/、?三个中的任何一个字符进入命令行模式。按Esc返回命令模式。
插入模式 <-> 命令行模式:不能互转。只能通过切换到命令模式再进行切换。
说明:命令模式可以和插入模式及命令行模式切换, 但插入模式与命令行模式间不能相互切换,只能通过命令模式中转切换。图示如下:
命令模式切换到插入模式不同插入字符的区别:
i 从目前光标所在处插入
I 目前所在行的第一个非空格符处开始插入
a 从光标所在的下一个字符处开始插入
A 从光标所在行的最后一个字符处开始插入
o 光标所在行的下一行插入新的一行。
O 光标所在行的上一行插入新的一行。
r 替换光标所在的那个字符一次
R 一直替换光标所在的文字,直到按下Esc键为止。
vi常用命令
移动光标命令
h或向左键(←) 光标向左移劢一个字符 j或向下键(↓) 光标向下移劢一个字符 k或向上键(↑) 光标向上移劢一个字符 l或向右键(→) 光标向右移劢一个字符 Ctrl+f 向下翻一页 Ctrl+b 向上翻一页 n<space> 按下数字n后再按空格键,光标向右移动这一行n个字符 0 移动到这一行的最前面字符处 $ 移动到这一行的最后面字符处 G 移动到文件最后一行 nG 移动到文件第n行 gg 移动到文件第一行,相当于1G n<Enter> 向下移动n行
查找字符串命令
/word 向下查找字符串word。输入n,继续向下查找字符串word。输入N,向上查找字符串word(常用)
?word 向上查找字符串word。输入n,继续向上查找字符串word。输入N,向下查找字符串word(常用)
替换字符串命令
:n1,n2s/word1/word2/g 在第 n1和n2行之间查找word1字符串,并将该字符串替换为word2(常用) :1,$s/word1/word2/g 从第一行到最后一行查找找 word1 字符串,并将该字符串替换为word2(常用) :1,$s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串替换为word2,且在替换前显示提示字符给用户确认是否需要替换
删除、复制与粘贴字符串命令
x,X x为向后删除一个字符,X为向前删除一个字符(常用) nx n为数字,向后连续删除n个字符。 dd 删除游标所在的那一整行(常用) ndd n为数字,删除光标所在的向下n行 d1G 删除光标所在到第一行的所有数据 dG 删除光标所在到最后一行的所有数据 d$ 删除游标所在处,到该行的最后一个字符 d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符 yy 复制游标所在的那一行(常用) nyy n 为数字。复制光标所在的向下n行 y1G 复制光标所在行到第一行的所有数据 yG 复制光标所在行到最后一行的所有数据 y0 复制光标所在的那个字符到该行行首的所有数据 y$ 复制光标所在的那个字符到该行行尾的所有数据 p, P p为将已复制的数据在光标下一行粘贴,P则为粘贴在游标上一行! J 将光标所在行与下一行癿数据结合成同一行 u 复原前一个劢作(常用)
显示行号命令
:set nu 显示行号,设定后,会在每一行的前缀显示该行的行号
:set nonu 取消行号显示
保存或取消文件修改命令
:wq 保存修改文件后退出(常用) :wq! 强制保存修改文件后退出,常用于文件为只读情况。 :q 不保存文件退出(常用) :q! 强制退出不保存文件,常用于若修改过文件但又不想保存情况
案例操作练习
测试题目
1、在/tmp目录下建立一个名为vitest的目录; 2、迚入 vitest 这个目录当中; 3、将 /etc/man.config 复制到本目录下 4、使用vi打开man.config文件 5、在vi中设定一下行号 6、移动到第 58 行,向右移动 40 个字符 7、移动到第一行,并且向下搜寻一下bzip2字符串 8、接着下来,我要将 50 到 100 行之间癿小写man字符串改为大写MAN字符串,并且一个一个挑选是否需要修改,如何操作? 9、修改完后,突然反悔了,要全部复原,有哪些方法? 10、我要复制 65 到 73 这九行的内容,并且贴到最后一行之后 11、第21到42行之间的开头为 # 符号的批注数据我不要了,要如何删除? 12、移动到第27行,并且删除15个字符 13、在第一行新增一行,该行内容输入I am a student 14、保存文件修改后退出
答案
中括号中的内容为要操作的命令: 1、[cd /tmp;mkdir vitest] 2、[cd vitest] 3、[cp /etc/man.config] . 4、[vi man.config] 5、输入[:set nu] 6、按[Esc]切换到命令模式,先输入[58G]再输入[40→] 7、先输入[1G]或[gg]后,再输入[/bzip2] 8、输入[:50,100s/man/MAN/gc] 9、(1)可以一直按[u]回复到原始状态,(2)使用不保存离开[:q!]后,再重新打开文件 10、输入[65G]移动到第65行, 然后再输入[9yy]之后最后一行会出现复制九行的说明字样。按下[G]到最后一行,再按[p]粘贴! 11、输入[21G]移动到第21行,再输入[22d]就删除22行 12、输入[27G]移动到第27行,再输入[15x]即可删除15个字符 13、输入[1G]移动第一行,然后输入大写字母[O]便新增一行且在插入模式;开始输入[I am a student] 14、按下[Esc]切花到命令模式,输入[:wq]保存文件退出
练习题
1、vi打开文件后,要在第34行向右移动15个字符,如何操作? 2、vi打开文件后,如何去到文件的页首或页尾? 3、vi打开文件后,如何在光标所在行中,移动到行首或行尾? 4、如何切换一般模式、命令行模式、编辑模式? 5、如何删除一行、n 行,如何删除一个字符? 6、如何复制一行、n 行并加以粘贴? 7、如何查找string这个字符串? 8、如何替换文件中所有的word1字符串成为word2? 9、如何保存、退出、保存后退出、强制保存后退出文件? 10、vi编辑文件做了很多修改后,如何还原成原来的文件内容? 11、vi打开文件后,如何显示行号和取消行号?
参考资料
1、鸟哥Linux私房菜基础学习篇<第三版>,鸟哥 著