Linux 编程基础
上QQ阅读APP看书,第一时间看更新

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键,把缓冲区中的内容贴在当前光标位置。