vi的使用

 vi的使用

vi编辑器是Linux强有力的文本文件编辑工具,利用它可以建立、修改文本文件。为了进入vi编辑程序,可以用下面的命令:

$vi filename

其中filename是要编辑器的文件的路径名。如果文件不存在,它将为你建立一个新文件。vi编辑程序有三种操作方式,分别称为编辑方式,插入方式和命令方式。当运行vi时,首先进入编辑方式。

1.1 编辑方式

vi的编辑方式的主要用途是在被编辑的文件中移动光标的位置。一旦光标移到到所要的位置,就可以进行剪切和粘贴正文块,删除正文和插入新的正文。当完成所有的编辑工作后,需要保存编辑器结果,退出编辑程序回到shell提示符,可以发出ZZ命令,连续按两次大写的Z键。

1.1.1    光标定位

如果键盘上有上、下、左、右箭头键,就由这些键来完成光标的移动。另外,可以用下面的键完成同样的功能:

k               上移;

j               下移;

h               左移;

l               右移。

这4个键将光标位置每次移动一行或一个字符。vi还提供大范围移动光标的命令:

ctrl+f          在文件中前移一页(相当于page down)。

ctrl+b          在文件中后移一页(相当于page up)。

在屏幕中找到需要的一页时,可以用下面的命令快速移动光标:

H               将光标移到屏幕上的起始行(或最上行);

M               将光标移到屏幕中间;

L               将光标移到屏幕最后一行。

同样需要注意字母的大小写。H和L命令还可以加数字。如2H表示将光标移到屏幕的第2行,3L表示将光标移到屏幕的倒数第3行。

当将光标移到所要的行是,行中的正确位置可以用下面的命令来实现:

w               右移光标到下一个字的开头;

e               右移光标到一个字的末尾;

b               左移光标到前一个字的开头;

0               数字0,左移光标到本行的开始;

$               右移光标,到本行的末尾;

^               移动光标,到本行的第一个非空字符。

1.1.2    搜索字符串

和许多先进的编辑器一样,vi 提供了强大的字符串搜索功能。要查找文件中指定字或短语出现的位置,可以用 vi 直接进行搜索,而不必以手工方式进行。搜索方法是:键入字符 / ,后面跟以要搜索的字符串,然后按回车键。编辑程序执行正向搜索(即朝文件末尾方向),并在找到指定字符串后,将光标停到该字符串的开头;键入 n 命令可以继续执行搜索,找出这一字符串下次出现的位置。用字符 ? 取代 / ,可以实现反向搜索(朝文件开头方向)。例如:

/str1               正向搜索字符串 str1

n               继续搜索,找出 str1 字符串下次出现的位置

?str2               反向搜索字符串 str2

无论搜索方向如何,当到达文件末尾或开头时,搜索工作会循环到文件的另一端并继续执行。

1.1.3    替换和删除

将光标定位于文件内指定位置后,可以用其他字符来替换光标所指向的字符,或从当前光标位置删除一个或多

个字符。例如:

rc              用 c 替换光标所指向的当前字符

nrc             用 c 替换光标所指向的前 n 个字符

5rA             用 A 替换光标所指向的前 5 个字符

x               删除光标所指向的当前字符

nx              删除光标所指向的前 n 个字符

3x              删除光标所指向的前 3 个字符

dw              删除光标右侧的字

ndw             删除光标右侧的 n 个字

3dw             删除光标右侧的 3 个字

db              删除光标左侧的字

ndb             删除光标左侧的 n 个字

5db             删除光标左侧的 5 个字

dd              删除光标所在行,并去除空隙

ndd             删除 n 行内容,并去除空隙

3dd             删除 3 行内容,并去除空隙

其他常用的删除命令是:

d$              从当前光标起删除字符直到行的结束;

d0              从当前光标起删除字符直到行的开始;

J               删除本行的回车符(CR),并和下一行合并。

1.1.4    剪切和粘贴

从正文中删除的内容(如字符、字或行)并没有真正丢失,而是被剪切并复制到了一个内存缓冲区中。用户可将其粘贴到正文中的指定位置。完成这一操作的命令是:

p               小写字母 p,将缓冲区的内容粘贴到光标的后面

P               大写字母 P,将缓冲区的内容粘贴到光标的前面

如果缓冲区的内容是字符或字,直接粘贴在光标的前面或后面;如果缓冲区的内容为整行正文,则粘贴在当前光标所在行的上一行或下一行。

注意上述两个命令中字母的大小写。vi 编辑器经常以一对大、小写字母(如 p 和 P)来提供一对相似的功能。通常,小写命令在光标的后面进行操作,大写命令在光标的前面进行操作。

有时需要复制一段正文到新位置,同时保留原有位置的内容。这种情况下,首先应当把指定内容复制(而不是剪切)到内存缓冲区。完成这一操作的命令是:

yy              复制当前行到内存缓冲区

nyy             复制 n 行内容到内存缓冲区

5yy             复制 5 行内容到内存缓冲区

1.1.5    撤销和重复

在编辑文档的过程中,为消除某个错误的编辑命令造成的后果,可以用撤消命令。另外,如果用户希望在新的光标位置重复前面执行过的编辑命令,可用重复命令。

u               撤消前一条命令的结果

.               重复最后一条修改正文的命令

1.2 插入方式

1.2.1    进入插入方式

在编辑模式下正确定位光标之后,可用以下命令切换到插入模式:

i               在光标左侧插入正文

a               在光标右侧插入正文

o               在光标所在行的下一行增添新行

O               在光标所在行的上一行增添新行

I               在光标所在行的开头插入

A               在光标所在行的末尾插入

上面介绍了几种切换到插入模式的简单方法。另外还有一些命令,它们允许在进入插入模式之前首先删去一段正文,从而实现正文的替换。这些命令包括:

s               用输入的正文替换光标所指向的字符

ns              用输入的正文替换光标右侧 n 个字符

cw              用输入的正文替换光标右侧的字

ncw             用输入的正文替换光标右侧的 n 个字

cb              用输入的正文替换光标左侧的字

ncb             用输入的正文替换光标左侧的 n 个字

cd              用输入的正文替换光标的所在行

ncd             用输入的正文替换光标下面的 n 行

c$              用输入的正文替换从光标开始到本行末尾的所有字符

c0              用输入的正文替换从本行开头到光标的所有字符

1.2.2    退出插入方式

退出插入模式的方法是,按 ESC 键或组合键Ctrl+[ 。

1.3 命令方式

在 vi 的命令模式下,可以使用复杂的命令。在编辑模式下键入“:”,光标就跳到屏幕最后一行,并在那里显示冒号,此时已进入命令模式。命令模式又称“末行模式”,用户输入的内容均显示在屏幕的最后一行,按回车键,vi 执行命令。

1.3.1    退出命令

在编辑模式下可以用 ZZ 命令退出 vi 编辑程序,该命令保存对正文所作的修改,覆盖原始文件。如果只需要退出编辑程序,而不打算保存编辑的内容,可用下面的命令:

: q             在未作修改的情况下退出

q!                放弃所有修改,退出编辑程序

1.3.2    行号与文件

编辑中的每一行正文都有自己的行号,用下列命令可以移动光标到指定行:

: n             将光标移到第 n 行

命令模式下,可以规定命令操作的行号范围。数值用来指定绝对行号;字符“.”表示光标所在行的行号;字符符“$”表示正文最后一行的行号;简单的表达式,例如“.+5”表示当前行往下的第 5 行。例如:

:345                将光标移到第 345 行

:345w file      将第 345 行写入 file 文件

:3,5w file          将第 3 行至第 5 行写入 file 文件

:1,.w file          将第 1 行至当前行写入 file 文件

:.,$w file          将当前行至最后一行写入 file 文件

:.,.+5w file       从当前行开始将 6 行内容写入 file 文件

:1,$w file          将所有内容写入 file 文件,相当于 :w file 命令

在命令模式下,允许从文件中读取正文,或将正文写入文件。例如:

:w              将编辑的内容写入原始文件,用来保存编辑的中间结果

:wq             将编辑的内容写入原始文件并退出编辑程序(相当于 ZZ 命令)

:w file         将编辑的内容写入 file 文件,保持原有文件的内容不变

:a,bw file          将第 a 行至第 b 行的内容写入 file 文件

:r file         读取 file 文件的内容,插入当前光标所在行的后面

:e file         编辑新文件 file 代替原有内容

:f file         将当前文件重命名为 file

:f              打印当前文件名称和状态,如文件的行数、光标所在的行号等

1.3.3    字符串搜索

给出一个字符串,可以通过搜索该字符串到达指定行。如果希望进行正向搜索,将待搜索的字符串置于两个“/”之间;如果希望反向搜索,则将字符串放在两个“?”之间。例如:

:/str/              正向搜索,将光标移到下一个包含字符串 str 的行

:?str?          反向搜索,将光标移到上一个包含字符串 str 的行

:/str/w file        正向搜索,并将第一个包含字符串 str 的行写入 file 文件

:/str1/,/str2/w file    正向搜索,并将包含字符串 str1 的行至包含字符串 str2 的行写

1.3.4    正则表达式

当给vi指定搜索字符串时,可以包含具有特殊含义的字符。包含这些特殊字符的搜索字符串称为正则表达式(regular expressions)。

例如,要搜索一行正文,这行正文的开头包含struct字。下面的命令做不到这一点:

:/struct/

因为它只找出在行中任意位置包含struct的第一行,并不一定在行的开始包含struct。解决问题的办法是在搜索字符串前面加上特殊字符^:

:/^struct/

^字符比较每行开头的字符串。所以上面的命令表示:找出以字符串struct开头的行。

也可以用类似办法在搜索字符串后面加上表示行的末尾的特殊字符$来找出位于行末尾的字:

:/^struct/

下表给出大多数特殊字符和它们的含义:

^               放在字符串前面,匹配行首的字;

$               放在字符串后面,匹配行尾的字;

<              匹配一个字的字头;

>              匹配一个字的字尾;

.             匹配任何单个正文字符;

[str]               匹配str中的任何单个字符;

[^str]          匹配任何不在str中的单个字符;

[a-b]           匹配a到b之间的任一字符;

*               匹配前一个字符的0次或多次出现;

               不管后面的字符的特殊含义。

1.3.5    正文替换

利用 :s 命令可以实现字符串的替换。具体的用法包括:

:s/str1/str2/       用字符串 str2 替换行中首次出现的字符串 str1

:s/str1/str2/g      用字符串 str2 替换行中所有出现的字符串 str1

:.,$ s/str1/str2/g  用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1

:1,$ s/str1/str2/g  用字符串 str2 替换正文中所有出现的字符串 str1

:g/str1/s//str2/g   功能同上

从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。

1.3.6    删除正文

在命令模式下,同样可以删除正文中的内容。例如:

:d              删除光标所在行

:3d             删除 3 行

:.,$d               删除当前行至正文的末尾

:/str1/,/str2/d     删除从字符串 str1 到 str2 的所有行

在vi的命令模式下进行以下操作:

1、  删除当前光标行及后面的3行

:.,.+3d

2、  删除文件的最后10行。

:$-9,$d

3、  从当前光标行向前搜索找出文件中下一个包含3位或3位以上的数字的行。

:/[0-9][0-9][0-9]

4、  在当前行中删除从aa到zz的所有字符。

:s/aa.*zz//

5、  在整个文件用and代替所有的&字符。(两种方式)

:g/&/s//and/g

:1,$s/&/and/g

6、  在每一行的行首插入字符串new

:1,$s/^/new/g

7、  在第10行到第50行的行尾插入字符串@@

:10,50s/$/@@/g

1.3.7    恢复文件

vi 在编辑某个文件时,会另外生成一个临时文件,这个文件的名称通常以 . 开头,并以 .swp 结尾。vi 在正常退出时,该文件被删除,若意外退出,而没有保存文件的最新修改内容,则可以使用恢复命令:

:recover            恢复文件

也可以在启动 vi 时利用 -r 选项。

1.3.8    选项设置

为控制不同的编辑功能,vi 提供了很多内部选项。利用 :set 命令可以设置选项。基本语法为:

:set option         设置选项 option

常见的功能选项包括:

autoindent      设置该选项,则正文自动缩进

ignorecase      设置该选项,则忽略规则表达式中大小写字母的区别

number          设置该选项,则显示正文行号

ruler               设置该选项,则在屏幕底部显示光标所在行、列的位置

tabstop         设置按 Tab 键跳过的空格数。例如 :set tabstop=n,n 默认值为 8

mk              将选项保存在当前目录的 .exrc 文件中

1.3.9    shell切换

当处于编辑的对话过程中时,可能需要执行一些Linux命令。如果需要保存当前的结果,退出编辑程序,再执行所需的Linux命令,然后再回头继续编辑过程,就显得十分累赘。如果能在编辑的环境中运行Linux命令就要省事得多。在vi中,可以用下面的命令来做到这一点:

:! command          执行完 command后回到 vi

这称为Shell切换。它允许执行任何可以在标准的Shell提尔符下执行的命令。当这条命令执行完毕,控制返回给编辑程序。又可以继续编辑对话过程。

标签: 无
返回文章列表 文章二维码
本页链接的二维码
打赏二维码