Linux vi常见命令使用案例

声明与简介

本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。本文主要介绍Linux内置的编辑器vi的使用。

vi编辑器是所有Unix及Linux系统下标准的编辑器,它简单实用且功能强大。因为我们工作的环境多为Linux,安装配置各种软件时多以命令行的形式,这时就难免会用到vi,所以熟练使用它是基本的必备技能。本文主要介绍常见的vi命令的使用。

注:本文会根据实际实践更新。

vi使用模式

vi的使用模式有三种:一般模式、编辑模式、命令模式。

  • 一般模式可以理解为在外部对文件内容进行修改(删除)和光标的跳转、复制、粘贴、替换、删除等操作。详细命令见一般模式相关章节。
#进入一般模式可以通过如下方式:
vi filename #普通方式打开
vi + filename #打开文件光标到文末
vi +n filename #打开文件光标到n行
vi -r filename #以恢复方式打开文件,这里r是recover
vi +/pattern filename #以匹配pattern方式打开文件,即光标定位到pattern匹配处。
  • 编辑模式则输入进入文件内部进行内容的维护(增、删、改),这里是用户的实际编辑操作,底部会显示-- INSERT -- 字样。通过键盘上最左脚的ESC键可以切换到一般模式。
  • 命令模式则对文件的保存、格式设置、全局查找(替换)。一般模式下通过:和/或?可以切换到该模式。详细命令见命令模式相关章节。

一般模式

光标控制

光标控制,应用在一般模式下,它主要是控制光标的位置,即切换光标。比如将光标切换到文件的首行、尾行,某一行的首、尾等场景。

# 1 这里的n是光标要跳转的行号,比如4G则会跳转到文件的第4行首。   
# 注:1 该命令一般结合 :set nu一起使用,即先显示行号,再跳转。
# 2 文件行首可以通过1G实现。
nG

# 2 光标跳转的尾行的首位。这里G是大写。
G

# 3 光标跳转到当前行的行首。这里是数字0
0

# 4 光标跳转到行尾。
# 比如通过3G命令跳转到文件的第3行,这时再输入$,则会到第3行的尾部。
$

# 5 #光标局部单词级光标移动:围绕键盘的h、j、k、l定义的左、下、上、右光标局部跳转(一次一个字符)键,当然也可以通过↑↓←→,即上下左右键达到同样的效果。

h、j、k、l
↑ ↓ ← →

# 6 局部移动字级光标移动,这里w(右移一个单词word)、W(右移动一个单词word和标点),由于VI是主要面向英文环境,而英文的写作环境默认是空格作为单词间的空格,所以这里跳转的依据是空格。
# 不同的是W会跳过标点,而w则不会。而b(左移一个单词word)、W(左移一个单词word和标点)。
w(W)
b(B)

# 7 句子段落跳转( 控制句子的跳转,跳到句子的开头,)则跳到句子的结尾。{控制跳转到段落的开头,}则跳到段落的结尾。
( )
{ }

# 8 针对文件内容较多的情况,可以通过翻页命令控制。
# ctl b(PgUp)上翻,即往前(历史)翻页、 相当于back
# ctl f(PgDn)下翻,即往后(正前)翻页。相当于forward
# ctl u上翻半页,u相当于up
# ctl d下翻半页,d相当于down
# H代表当前页前部区域,H相当于head
# M代表当前页中部区域,M相当于Middle
# L代表当前页后部区域,L相当于Last
ctl+b、PgUp
ctl+f、PgDn
ctl+u
ctl+d
H
M
L

进入编辑模式

这种是由一般模式切换到编辑模式。

# 1 在当前光标前插入文本。这里i相当于insert
i

# 2 在当前行首插入文本,这里是大写的I
I

# 3 在当前光标后插入文本。这里a相当于append
a

# 4 在当前行末插入文本。
A

# 5 在当前行后面插入一空行 这里是字母0,不是数字0.
o

# 6 在当前行前面插入一空行
O

文本编辑

该部分主要涵盖在一般模式下对文本编辑的常见操作:如复制、粘贴、删除、替换等。

# 1 剪切当前光标下的字符  这里相当于ctl+x
x

# 2 删除光标所在的行
dd

# 3 删除光标之后的该行剩余部分,输入时先写d再SHIFT+4(即$)
d$

# 4 删除光标之后的单词剩余部分,单词级别这里单词不是严格意义上的单词。
dw

# 5 删除光标后字符,进入INSERT模式
cw

# 6 删除整行并进入INSERT模式
cc

# 7 以替换方式进入编辑 这里R相当于replace
R

# 8 删除光标(含)之后的n行
ndd

# 9 将光标所在行复制到缓冲区内。
yy

# 10 将光标所在行(含)后n行复制到缓冲区内。
nyy

# 11 将光标所在行(含)后n+1行复制到缓冲区内。
yn


# 12 将后面的n个单词移到
# 注:这里不是严格按照真正意义上的单词来计算。标点也算单词,如果光标在一个单词的中间,则后面也算一个单词。
ynw

# 13 光标后粘贴 #1 如果缓冲区里是多个单词则粘贴剪切板中的内容到当前光标之后
# 2 如果缓冲区里是一整行内容,则会在光标所在的行之后插入空行然后再插入整行内容。
p

# 14 光标前粘贴 #1 如果缓冲区里是多个单词则会粘贴剪切板中的内容到当前光标之前。
# 2 如果缓冲区里是一整行内容,则在光标所在的行前插入整行内容和空行。
P

# 15 撤销最近的操作,可以多次执行 撤销命令需要在一般模式下操作。
u

# 16 撤销当前行的编辑
U

# 17 修改光标后的一个单词,这里的单词不是严格意义的单词。
# 注:1执行后进入INSERT模式。
# 2 输入ESC后退出INSERT模式。
cw

# 18 修改修改光标后的n个单词,这里的单词不是严格意义的单词。
cnw

命令模式

文件操作 

在进入一般模式后以”:”的方式进入。可执行文件的保存、关闭等。

# 1 保存退出,注意要大写
ZZ
# 2 保存文件filename
:w filename
# 3 保存退出
:wq
# 4 写入文件
:W
# 5 写入文件
:x
# 6 不保存退出
:q!
# 7 退出
:q

匹配与替换 

主要在命令行模式完成模式查找、字符替换操作。

# 1 当前光标往后匹配要查找的单词word或关键字。 
# 注:如果匹配不到,则从顶部开始匹配。会出现如下警告:search hit BOTTOM, continuing at TOP
/word

# 2 当前光标往前匹配要查找的单词word或关键字。
?word

# 3 重复执行之前查找命令,往后(下)查。
n →

# 4 重复执行之前查找命令,往前(上)查
N →

# 5 对n1和n2直接的行用word2替换word1,即用后面的替换前面的。
# 注:这里g是global的缩写,即所有的都要替换
:n1,n2s/word1/word2/g

# 6 效果同上,不过这里没加g,如果一行里出现多个word1,那么只会替换首次出现的。
:n1,n2s/word1/word2

# 7 替换效果同上,不过这里替换的是光标所在的行且不是全局替换。
:s/word1/word2

# 8 对从n1开始用word2替换word1,即用后面的替换前面的。
#注:1 这里的$相当于文件的末尾的意思。
# 2 第二种方式的。(点)相当于文件的开头。
:n1,$s/word1/word2/g
:.,$s/word1/word2/g

# 9 替换每一行里的首个word1为word2.
# 注:1 这里的%相当于匹配每一行
# 2 第二种方式以g开头,意思是每一个行。
:%s/word1/word2/
:g/vivian/s//sky/

# 替换每一行里的word1为word2.
# 注:1 作用同上
# 2 第二种方式的g是gloabal,即每行里都全部替换的意思。
:%s/word1/word2/g
:g/vivian/s//sky/g

替换示例


Linux vi常用指令使用案例汇总_打开文件

原文件内容

#将第9行到11行里的of全部替换为OF
:9,11s/of/OF/g
#如果只是替换某行里的第一个则不用加g参数,详细见前文列表出介绍


Linux vi常用指令使用案例汇总_打开文件_02

全局替换后

​​