1.5 VI编辑器的使用
VI编辑器是Linux中的文本编辑器。VI虽然没有图形界面编辑器(例如Windows中的记事本)操作简单、直观、易学易用,但VI编辑器在Linux系统管理、服务器管理中必不可少,是编写Shell、系统程序的重要工具。当没有安装GNOME/KDE桌面环境或桌面环境无法远程使用时,我们仍需要字符模式下的编辑器VI。VI编辑器是创建和编辑简单文档最高效的工具,且已经经历很长一段时间的发展。在终端中输入命令vi或者vim,即可启动VI编辑器,也可加上文件名称作为参数,如果文件存在,则VI同时显示文件内容供用户浏览编辑,将光标定位在第一行第一列;如果不存在,则打开一个指定名称的空文件,将光标定位在第一行第一列。如果用户保存则创建该文件,否则不创建文件。图1.17所示是用vim命令打开VI编辑器的界面。
图1.17 vim打开界面
VI编辑器有3种状态:命令模式、插入模式和可视模式。在命令模式情况下,用户可在VI编辑器的下方输入命令,如保存、查找、替换等。在插入模式下,用户对文本内容进行插入、删除、添加等操作。可视模式提供了友好的选取文本范围并高亮显示的功能。这3种模式可相互切换。当用户打开VI后,默认的模式为命令模式。当处于插入或者可视模式时,通过Esc键切换至命令模式。此时,我们输入冒号:,冒号之后可以输入各种命令,其具体含义如下。
:w 将文件内容保存到vi命令所指定的文件中
:w filename 将文件另存为filename
:wq! 将文件内容保存到vi命令所指定的文件中然后退出vi
:wq! filename以filename为文件名保存后退出
:q! 不保存直接退出VI
:x 保存并退出,功能和:wq!相同
:q 退出命令,如果文件内容有修改,VI会提示需要保存才能退出,否则退出VI
基本VI命令如下。
(1)光标的移动
j: 向下移动一行;
k: 向上移动一行;
h: 向左移动一个字符;
l: 向右移动一个字符;
ctrl+b: 向上移动一屏;
ctrl+f: 向下移动一屏;
Up: 向上移动一行;
Down: 向下移动一行;
Left: 向左移动一个字符;
Right: 向右移动一个字符;
G: 移到文件最后;
w: 移到下个字的开头;
b: 跳至上个字的开头。
编辑一个文件时,对于 j、k、h和l键,可在这些动作命令的前面加上数字表示移动的单元数,如3j表示向下移动3行。3h表示向左移动3个字符。
(2)文本内容的删除操作
x: 删除当前光标所在后面一个字符。
#x: 删除当前光标所在后面#个字符。例如,3x表示删除3个字符。
dd: 删除当前光标所在行。这里的删除相当于Windows中的剪切操作。
dw: 删除一个单词,光标必须在单词开始之处。这里的删除相当于Windows中的剪切操作。
#dd: 删除当前光标所在后面#行。例如,6dd表示删除自光标起6行。
X: 删除当前光标的左字符。
D: 从光标所在地方删至行尾。
(3)文本更改操作
cw: 更改光标处的字到此单词的字尾处(cw的含义为change word)。
c#w: 表示修改多个单词。例如,c3w表示更改3个单词。
cc: 修改一行。无论光标在何处。
C: 替换到行尾。
这里的替换都是先将内容清除然后用户重新输入。
(4)文本插入操作及插入模式
文本插入操作是指在光标所在的地方插入文本内容。用户只有在插入模式下才能输入内容。通过插入命令可以从命令模式转换为插入模式。下例的命令均可进入插入模式。
i:在光标之前插入。
a:在光标之后插入。
I:在光标所在行的行首插入。
A:在光标所在行的行末插入,此时,光标跳到行末,然后插入文本。
o:在光标所在的行的下面插入一行。
O:在光标所在的行的上面插入一行。
s:删除光标后的一个字符。
S:删除光标所在的行。
(5)文本复制操作
yw: 复制光标处的字到字尾至缓冲区。
p: 把缓冲区的内容贴到光标所在的下一行。将dd、dw等命令与p命令结合起来完成剪切粘贴操作。
yy: 复制光标所在之行至缓冲区。
#yy: 如5yy,复制光标所在之处以下5行至缓冲区。
(6)恢复修改及恢复删除操作
按Esc键返回命令模式,然后按u键来撤销以前的删除或修改,若想撤消多个以前的修改或删除操作,可多输入几次u。这和Word的撤销操作没有太大的区别。
(7)可视模式
在命令模式下按v就进入可视模式;可视模式可以高亮显示文本内容,为我们提供了极为友好的选取文本范围的方法,如图1.18所示。
图1.18 VI的可视模式
(8)VI查找和替换
VI提供了查找文件中字符串位置及全局替换的方法。在命令模式下输入/或?可进入查找模式。输入“/searchstring”然后回车,VI光标定位从光标位置开始第一次出现的地方。输入n跳到该串的下一个出现处,输入N跳到该串上一次出现的地方。
在替换时,可指定替换的范围(1,n),当n为$时指最后一行。s是替换命令,g代表全部替换。
例如:
:l,$s/patternl/pattern2/g
将行l至结尾的文字中匹配模式patternl的字符串改为pattern2字符串。如无g,则仅更换每一行所匹配的第一个字符串;如有g,则将每一个字符串均做替换。现有一文件有如下内容:
1 user A 10 20 40 50
2 user B 30 40 50 60
3 user C 50 60 30 20
4 user D 70 30 42 10
现在将文件中所有的user字符串替换为USER字符串的命令为:
1,$ s/user/USER/g
执行该命令后的文件内容变为:
1 USERA 10 20 40 50
2 USERB 30 40 50 60
3 USERC 50 60 30 20
4 USERD 70 30 42 10
同时VI编辑器的最下方显示替换的结果:
4 substitutions on 4 lines
(9)编辑多个文件
将一个文件插入另一个文件中;将另一个文件filename插入当前文件的line#行位置。
:line# r filename
例如,将文件file1插入当前文件的当前光标位置,键入:
:r file1
要想编辑多个文件,需要在VI命令之后列多个文件名,中间用空格分开。键入:n进入下一个文件。要想跳转到下一个文件,而不保存对当前文件所做的修改,则键入:n!来代替:n。
vi file1 file2 file3
若要在文件之间复制行,首先编辑第一个文件file1,然后用#yy(#代表数字)把要复制的行复制到缓冲区,不退出VI;键入":n file2 ",再按p键,把缓冲区中的内容贴在当前光标位置。