在 Linux 和 Unix 系统中,vi 编辑器是最经典、最常用的文本编辑工具之一,而掌握行尾操作是高效编辑文件的关键技能,行尾操作不仅包括简单的光标定位,还涉及文本的删除、复制、替换以及模式匹配等多种高级功能,本文将详细讲解 vi 命令中与行尾相关的操作,包括基础定位、删除、复制粘贴、替换模式以及结合正则表达行的扩展应用,并通过表格对比不同命令的功能差异,最后以 FAQs 形式解答常见疑问。

行尾定位操作
在 vi 中,快速定位到行尾是进行其他操作的前提,最常用的命令是 ,该命令可以将光标移动到当前行的最后一个非空白字符处(若行尾有空白字符,则需结合其他命令),若需精确移动到行尾的最后一个字符(包括空白字符),可使用 命令后按 Shift+@
(部分终端中为 直接定位到绝对行尾)。0
命令用于定位到行首,而 则与 0
形成首尾呼应,构成行范围操作的基础,在普通模式下输入 即可跳转,若需在多行间快速跳转,可结合数字键,如 2$
表示移动到第二行的行尾。
行尾删除操作
删除行尾文本是编辑中的高频需求,vi 提供了多种灵活的删除方式,最基础的是 d$
命令,该命令会删除从当前光标位置到行尾的所有字符,若需删除整行内容,可使用 dd
,但若仅删除行尾部分,d$
更为精准,若当前光标在行首,d$
相当于删除整行;若光标在行中,则删除光标右侧至行尾的内容。D
命令(大写)与 d$
功能完全相同,可作为快捷键使用,若需删除包含行尾的多行内容,可结合行号操作,如 .,$d
表示删除当前行到文件末尾的所有行(需在命令行模式下执行)。
行尾复制与粘贴
复制行尾文本常用于重复利用或移动文本片段,vi 中与复制相关的命令是 y
(yank),y$
表示复制从光标位置到行尾的内容,复制后的文本会暂存于默认寄存器中,若需粘贴,可在普通模式下使用 p
(粘贴到光标后)或 P
(粘贴到光标前),将当前行尾内容复制后,移动到目标位置按 p
即可粘贴,若需复制多行至行尾,可结合行号,如 .,$y
复制当前行到文件末尾的所有内容,粘贴时同样使用 p
或 P
,需要注意的是,复制操作不会删除原文本,与剪切(d
命令)有所区别。
行尾替换与修改
替换行尾文本时,vi 提供了多种模式以适应不同场景,在普通模式下,c$
命令会删除从光标到行尾的内容并进入插入模式,允许直接输入新文本,若需修改行尾的某个单词,可将光标移至单词起始处,输入 c$
删除后续内容并输入新内容,若仅需替换单个字符,可使用 r
命令,但 r
仅能替换单个字符,无法处理行尾的多字符替换,在替换模式下(通过 R
命令进入),可直接输入文本覆盖从光标位置开始的内容,包括行尾字符,但需注意替换模式下每输入一个字符会覆盖原文本的一个字符,适合逐字符替换场景。

结合正则表达行的行尾操作
vi 的强大之处在于支持正则表达式,可实现复杂的行尾匹配与操作,在命令行模式下,%s/pattern$//g
命令表示全局查找所有以 pattern
结尾的行,并删除行尾的 pattern
(替换为空)。%s/\.txt$//g
可删除所有文件名行尾的 .txt
后缀,若需在行尾插入特定文本,可使用 %s/$/newtext/g
,即在每行末尾添加 newtext
。 配合行号范围与 可实现更精准的操作,如 1,10s/$/end/
表示在 1 到 10 行的每行末尾添加 end
,正则表达式与行尾符号 的结合,使得批量处理文件内容变得高效。
不同行尾命令的功能对比
为更直观地理解各类行尾命令的差异,以下通过表格对比常见命令的功能范围、模式及适用场景:
命令 | 功能描述 | 所属模式 | 适用场景 |
---|---|---|---|
光标定位到行尾 | 普通模式 | 快速跳转,为其他操作做准备 | |
d$ |
删除光标至行尾内容 | 普通模式 | 清理行尾无用文本 |
D |
同 d$ ,快捷命令 |
普通模式 | 快速删除行尾 |
y$ |
复制光标至行尾内容 | 普通模式 | 复制行尾文本供后续粘贴 |
c$ |
删除光标至行尾并进入插入模式 | 普通模式 | 修改行尾内容 |
%s/$/text/g |
在每行尾插入 text |
命令行模式 | 批量添加行尾后缀或标识 |
相关问答 FAQs
问题 1:在 vi 中,如何删除从当前光标到行尾的所有内容,但保留换行符?
解答:使用 d$
命令即可实现。d$
会删除从光标位置到行尾的所有字符,但不会删除换行符(即行尾的 符号本身不会被删除,而是保留换行功能),若需删除包括换行符在内的整行,应使用 dd
命令。
问题 2:如何批量删除文件中所有行尾的特定字符串(如逗号)?
解答:可通过正则表达式实现,在 vi 的命令行模式下输入 %s/,$//g
, 表示匹配行尾的逗号, 表示替换为空,g
表示全局替换,执行后,文件中所有行尾的逗号将被删除,若需确认替换结果,可先使用 %s/,$//gc
,c
会在每次替换前提示确认,避免误操作。