vi是所有UNIX系统都会提供的屏幕编辑器,它提供了一个视窗设备,通过它可以编辑文件。当然,对UNIX系统略有所知的人,或多或少都觉得vi超级难用,但vi是最基本的编辑器,学好了vi,以后在UNIX世界里必将畅行无阻、游刃有余,因为其他几种文本处理器并非UNIX标准配备。若其它的Linux机器里没有安装joe或pico,如果不会使用vi,那可能就真的没辄了。
vi编辑器有3种模式:命令模式、输入模式、末行模式。掌握这三种模式十分重要:
命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在任何模式下只要按一下[Esc]键都可以返回命令模式。在命令模式中输入字母i或o或a,就可以进入vi的输入模式编辑文件。 输入模式:在这个模式中我们可以编辑、修改、输入等编辑工作,在编辑器最后一行显示一个“--INSERT--”标志着vi进入了输入模式。当我们完成修改输入等操作的时候我们需要保存文件,这时我们需要先返回命令模式,在进入末行模式保存。 末行模式:在命令模式输入“:”即可进入该模式,在末行模式中有好多好用的命令。下面介绍vi常用的命令操作
进入输入模式命令
i 在光标 左侧输入正文 [常用] a 在光标 右侧输入正文 [常用] o 小写字符o, 在光标所在行的 下一行增添新行 O 大写字符O, 在光标所在行的 上一行增添新行 I 在光标 所在行的开头输入正文 A 在光标 所在行的末尾输入正文 上面介绍了几种切换到插入模式的简单方法。另外还有一些命令,它们允许在进入插入模式之前首先删去一段 正文,从而实现正文的替换。这些命令包括: s 用输入的正文替换光标所指向的字符 [常用] ns 用输入的正文替换光标右侧 n 个字符 cw 用输入的正文替换光标右侧的字 [常用] ncw 用输入的正文替换光标右侧的 n 个字 cb 用输入的正文替换光标左侧的字 [常用] ncb 用输入的正文替换光标左侧的 n 个字 cd 用输入的正文替换光标的所在行 [常用] ncd 用输入的正文替换光标下面的 n 行 c$ 用输入的正文替换从光标开始到本行末尾的所有字符 [常用]c0 用输入的正文替换从本行开头到光标的所有字符 [常用]
r 取代光标所在处的字符, 比如 c3 表示将光标所在处的字符替换为字符3 [常用]
R 取代字符直至按【ESC】为止
按【Esc】键或组合键【ctrl】+[ 退出输入模式
末行模式
w 保存文件 [常用]
w file 将当前文件的内容保存到file文件
wq 保存文件并退出vi编辑器 [常用]
wq file 将 当前文件的内容写入 file 文件,并保持原有文件的内容不变,然后退出vi编辑器(假如当前文件内容有变动但未执行保存操作,那么执行该命令后不会退出vi编辑器)
r file 读取 file 文件的内容,插入当前光标所在行的后面
e file 关闭当前文件,并打开新文件 file (如果当前文件内容有变动但未保存,则该命令不会被执行) [常用] f file 将当前文件重命名为 file [常用] f 打印当前文件名称和状态,如文件的行数、光标所在的行号等q 退出vi编辑器(如果当前文件有改动,则无法退出) [常用]
q! 强制退出vi编辑器(不保存修改) [常用]
# 将光标移到第#行 [常用]
PS: 关于行号使用的一些技巧:
一般用数值来指定绝对行号;字符“.”表示光标所在行的行号;字符“$”表示文件最后一行的行号,例如:
.+5 将光标从当前行往下移动 5 行
$ 将光标移到文件的最后一行
1 将光标移到文件的第一行
23w file 将文件的第23行写入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 命令
移动光标的操作
【Page Up】 向上翻页
【Page Down】 向下翻页
【Delect】 删除光标位置的字符【Ctrl】+ f 向前移动一页
【Ctrl】 + b 向后移动一页
h 光标向左移动一个字符 [常用]nG 将光标定位到第n行的开头 [ 常用]
n+ 将光标下移n行
n- 将光标上移n行
n$ 将光标下移n行,并置于行尾
H 将光标置于当前屏幕的顶行
M 将光标置于当前屏幕的中间行
L 将光标置于屏幕的最后行
~ 改变当前字符的大小写 [ 常用]
>> 把当前行往右移动8个字符(相当于【tab】键) [ 常用]
<< 把当前行往左移动8个字符(相当于【Shift】 +【tab】) [ 常用]
nz: 将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。
撤销操作
u 命令撤销最近一次的操作,可以使用多次来恢复原有的操作 [ 常用] U 撤销所有操作 . 可以恢复对使用u命令的操作 [ 常用] 复制/删除/粘贴操作"bnx 把删除的字符放到缓存区b
dw 删除当前字符到单词尾(包括空格)的所有字符 [ 常用]
dd 删除光标所在行 [常用] [ 常用]ndd 删除n行。 例如, 3dd从当前行开始向下删除三行文本 [ 常用]
"bndd 把删除的内容放到缓存区b
PS: 如果要删除第m至第n行的内容,可以在末行模式中输入m,nd。比如3,5d表示删除第3~5行 [ 常用]
"bnyy 将复制的内容放到缓存区b . 比如, b3yy 将三行数据存入缓存区b [ 常用]
PS: 如果要复制第m行到第n行之间的内容,可以在末行模式中输入m,ny例如:3,5y复制第三行到第五行内容到缓存区 [ 常用]
yw 复制当前光标所在位置到单词尾字符 (不包括空格) 的内容到vi缓存区,相当于复制一个单词 [常用]p 小写p, 将缓存区的内容粘贴到当前行的下方(与yy配合) ,或插入到当前光标的下一个位置(与dw, x, y$ , y^ 配合)[常用]
P 大写P,与小写p的作用类似,但粘贴都方向相反
vi的查找与替换功能要再末行模式下完成。
/关键字 自上而下查找,比如/work,表示从当前光标处往下查找关键字为work的内容 [ 常用]
?关键字 自下而上查找 , 比如/work,表示从当前光标处往上查找关键字为work的内容 [ 常用]
PS: 当找到匹配项时,光标会定位在关键词都字符开头。要继续查找下一个匹配项,只需敲入字符n; 要往回查找,敲入N. 可以输入2n往下查找下下一个匹配项
s/old_string/new_string 用new_string替换光标所在行中首次出现的old_string
s/old_string/new_string/g 用new_string替换光标所在行中的所有old_string
m,ns/old_string/new_string/g 用new_string替换第m行至第n行的所有old_string [ 常用]
%s/old_string/new_string/g 用new_string替换所有的old_string [ 常用]
/pattern_address/s/old_string/new_string/g 从当前光标处往下查找与pattern_address匹配的行,然后在该行上用new_string替换掉所有的old_string(实际上,这个命令是由 /pattern_address 和 /s/old_string/new_string/g组合而成)
g/pattern_address/s/old_string/new_string/g 找出所有与pattern_address匹配的行, 并用new_string替换掉每一行所有的old_string( 注意: 前后两个g的含义是不一样的,前面的g表示对整个文本搜索与pattern_address匹配的行, 后面的g表示针对每一个与pattern_address匹配的行都用new_string替换掉old_string)
如果pattern_address和old_string一样,可以简写为g/pattern_address/s//new_string
可以在所有的命令尾加一个c命令,强制每个替换需要用户进行确认,例如:s/old/new/c 或s/old/new/gc [ 常用]
PS: 查找的一些技巧
/str/w file 正向搜索,并将第一个包含字符串 str 的行写入 file 文件
/str1/,/str2/w file 正向搜索,并将包含字符串 str1 的行至包含字符串 str2 的行写入 file 文件 恢复文件vi在编辑某一个文件时,会生成一个临时文件,这个文件以 . 开头并以 .swp结尾。正常退出该文件自动删除,如果意外退出例如忽然断电,该文件不会删除,我们在下次编辑时可以选择一下命令处理:
O 只读打开,不改变文件内容
E 继续编辑文件,不恢复.swp文件保存的内容 R 将恢复上次编辑以后未保存文件内容 Q 退出vi D 删除.swp文件或者使用vi -r 文件名来恢复未保存的内容