在Linux系统中,vi(Visual Editor)是一款经典的文本编辑器,掌握其命令行输入方式是高效使用vi的关键,vi的核心设计基于“模式编辑”理念,即通过不同模式切换实现文本编辑与命令输入的分离,理解这一点是掌握vi命令行输入的前提。
vi的三种核心模式及切换逻辑
vi的操作依赖于三种基本模式:命令模式(Normal Mode)、插入模式(Insert Mode) 和 末行模式(Ex Mode),命令行输入主要在命令模式和末行模式下进行,而插入模式用于文本输入,三者间的切换是使用vi的基础。
命令模式(默认模式)
- 作用:执行所有命令,包括光标移动、文本删除、复制粘贴、文件保存等。
- 进入方式:打开vi文件时默认进入命令模式;或在插入模式/末行模式下按
ESC
键返回。 - 特点:此模式下键盘输入的字符会被识别为命令,而非文本内容,例如按
i
会进入插入模式,而非输入字母“i”。
插入模式
- 作用:输入文本内容(字母、数字、符号等)。
- 进入方式:在命令模式下按以下命令进入:
i
:在光标当前位置插入;I
:在当前行首插入;a
:在光标后一个位置插入;A
:在当前行尾插入;o
:在当前行下方新建一行并插入;O
:在当前行上方新建一行并插入。
- 退出方式:按
ESC
键返回命令模式。
末行模式
- 作用:执行文件保存、退出、搜索替换、参数设置等高级命令,命令以冒号开头。
- 进入方式:在命令模式下按(冒号),此时vi窗口底部会显示等待输入命令。
- 退出方式:命令执行后自动返回命令模式;或按
ESC
取消输入。
命令模式下的命令行输入
命令模式是vi的核心操作模式,绝大多数编辑命令在此模式下输入并执行,以下是常用命令的分类及使用方法:
光标移动命令
光标快速移动是高效编辑的基础,vi支持多种光标移动方式,包括字符级、行级、文件级移动:
命令 | 功能说明 | 示例 |
---|---|---|
h |
光标左移一个字符 | |
l |
光标右移一个字符 | |
j |
光标下移一行 | |
k |
光标上移一行 | |
0 (数字零) |
光标移至当前行首 | |
光标移至当前行尾 | ||
^ |
光标移至当前行第一个非空白字符 | |
w |
光标移至下一个单词开头(按空格/标点分隔) | |
e |
光标移至当前单词末尾 | |
b |
光标移至上一个单词开头 | |
gg |
光标移至文件第一行 | |
G |
光标移至文件最后一行 | |
nG (n为数字) |
光标移至第n行 | 10G 跳转至第10行 |
文本编辑命令
编辑命令包括删除、复制、粘贴、替换等操作,支持“操作对象+命令”的组合(如3dd
删除3行):
命令 | 功能说明 | 示例 |
---|---|---|
x |
删除光标所在字符 | |
X |
删除光标前一个字符 | |
dd |
删除当前行 | |
ndd (n为数字) |
删除n行 | 3dd 删除当前行及下方2行 |
yy |
复制当前行 | |
nyy (n为数字) |
复制n行 | 5yy 复制当前行及下方4行 |
p |
在光标后粘贴复制的内容 | |
P |
在光标前粘贴复制的内容 | |
d$ |
删除光标至行尾的内容 | |
d^ |
删除光标至行首第一个非空白字符的内容 | |
dw |
删除一个单词 | |
u |
撤销上一步操作 | |
Ctrl+r |
重做被撤销的操作 | |
r + 字符 |
替换光标所在字符为指定字符 | rA 将光标字符替换为“A” |
R |
进入替换模式,连续替换光标处字符 | 按ESC退出替换模式 |
搜索与替换命令
-
搜索:
- + 关键词:从光标位置向文件尾搜索,按
n
跳至下一个匹配项,N
跳至上一个。 - + 关键词:从光标位置向文件头搜索,
n
和N
方向同上。 - 示例:
/linux
搜索“linux”,按n
继续查找。
- + 关键词:从光标位置向文件尾搜索,按
-
替换(需在末行模式下执行,详见下一节)。
末行模式下的命令行输入
末行模式用于执行批量操作或文件管理命令,命令以冒号开头,执行后自动返回命令模式,以下是常用末行命令:
命令 | 功能说明 | 示例 |
---|---|---|
w |
保存当前文件 | |
w filename |
另存为指定文件 | w newfile.txt |
q |
退出vi(未修改文件时) | |
q! |
强制退出(不保存修改) | |
wq |
保存并退出 | |
x |
保存并退出(同wq ,但修改小时更高效) |
|
wq! |
强制保存并退出(只读文件时需加) | |
set nu |
显示行号 | |
set nonu |
取消显示行号 | |
1,10s/old/new/g |
替换1-10行中所有“old”为“new” | 1,5s/hello/hi/g |
%s/old/new/g |
替换整个文件中所有“old”为“new” | %s/error/ok/g |
s/old/new |
替换当前行第一个“old”为“new” | |
s/old/new/g |
替换当前行所有“old”为“new” | |
n1,n2d |
删除n1至n2行 | 3,8d 删除3-8行 |
n1,n2co n3 |
将n1-n2行复制到n3行下方 | 1,5co 10 复制1-5行到第10行下方 |
n1,n2m n3 |
将n1-n2行移动到n3行下方 | 3,6m 12 移动3-6行到第12行下方 |
命令行输入的注意事项
- 区分大小写:vi命令区分大小写,例如
dd
(删除行)与DD
(功能相同,但通常用小写),w
(保存)与W
(移动到大写单词开头,按空格分隔)含义不同。 - 数字前缀:多数命令支持数字前缀,表示重复次数,如
2yy
复制2行,3x
删除3个字符。 - 命令取消:在输入命令过程中(如末行模式输入命令时),按
ESC
可取消当前输入,返回命令模式。 - 模式提示:vi窗口底部会显示当前模式,如“– INSERT –”表示插入模式,“– NORMAL –”表示命令模式,“:”提示进入末行模式,可通过此状态判断当前模式。
相关问答FAQs
问题1:在vi中如何快速跳转到文件开头或结尾?
解答:跳转至文件开头:在命令模式下按gg
(小写g两次);跳转至文件结尾:按G
(大写G),若需跳转至指定行号,可输入nG
(n为行号,如20G
跳转至第20行)。
问题2:在vi中如何批量替换文件中的特定文本内容?
解答:需在末行模式下执行替换命令,语法为[范围]s/旧文本/新文本/g
。
- 范围省略时仅替换当前行,如
s/old/new/g
; - 范围为时替换整个文件,如
%s/old/new/g
; - 范围为行号时替换指定行,如
1,10s/old/new/g
(替换1-10行)。
若需替换确认(逐个确认替换),可在命令后加c
,如%s/old/new/gc
,此时会提示是否替换(y=替换,n=跳过,a=全部替换,q=退出)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/16525.html