VIM操作--跳到最后一行和跳到最后一行的最后一个字符

本文介绍了Vim编辑器的基本使用技巧,包括快速定位到文本的首尾位置、跳转到特定字符等实用操作,还提供了如何为Vim设置密码的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vim操作
1.跳到文本的最后一行:按“G”,即“shift+g”
2.跳到最后一行的最后一个字符 : 先重复1的操作即按“G”,之后按“$”键,即“shift+4”。
3.跳到第一行的第一个字符:先按两次“g”,
4.跳转到当前行的第一个字符:在当前行按“0”。
5.vi加密。进入vi,输入”:” + “X” 之后就提示你输入两次密码。之后:wq 保存退出。再次进入时就提示你输入密码了。如果你不想要密码了,就:X 提示你输入密码时连续按两次回车,就搞定了。

<think>我们有一个任务:在Vim中删除每行最后一个逗号后的所有字符。 思路: 1. 我们需要定位到每行的最后一个逗号。 2. 然后删除从该逗号之后直到行尾的所有字符(但不包括该逗号本身,因为要求是删除逗号后的字符)。 我们可以使用Vim的替换命令(:substitute)或者使用普通模式下的操作。 方法1:使用替换命令(针对整个文件或选定范围) 我们可以用正则表达式匹配最后一个逗号以及其后的所有字符(直到行尾),然后替换为最后一个逗号(即保留逗号,删除后面的内容)。但是注意,我们只想删除最后一个逗号后的内容,而不是所有的逗号后的内容。 正则表达式思路: - 匹配一个逗号,这个逗号后面没有其他逗号(即它是最后一个逗号),然后匹配该逗号后直到行尾的所有字符- 我们可以使用:`%s/\(.*\),.*$/\1/` 解释: - `\(.*\)` 匹配尽可能多的任意字符(贪婪匹配),并保存为一个分组(group 1)。 - 然后匹配一个逗号(注意:由于贪婪匹配,这个逗号将是最后一个逗号)。 - 再匹配逗号后的任意字符(直到行尾)`.*$`。 - 替换为`\1`,即只保留最后一个逗号之前的内容(包括该逗号之前的内容,但不包括该逗号本身?注意:这里的分组中不包含逗号,所以实际上我们删除了最后一个逗号及其后的所有内容?) 但是,上面的正则表达式会删除最后一个逗号及其后的内容,而我们要求是删除逗号后的字符(保留逗号)。所以我们需要调整:我们想要保留逗号,那么我们就需要将逗号也包含在分组中吗?不对,因为分组1中不包含逗号,所以我们需要在替换时把逗号加回去。 调整:我们想要保留直到最后一个逗号(包括逗号)之前的内容,然后删除后面的内容。但是上面的正则表达式在分组1中不包含逗号,所以替换后逗号被删除了。 因此,我们可以修改分组,将逗号也包含在分组中?但是这样分组1就会包含逗号,而我们匹配的整个模式是:分组1(包含逗号)加上逗号后的任意字符。这样替换为分组1,那么最后一个逗号就被保留了,但是注意,分组1中已经有一个逗号了,而我们匹配的整个字符串中包含了两个逗号?不对。 实际上,我们想要的是:将整个行替换为最后一个逗号之前的所有字符(包括最后一个逗号?不,我们要求删除逗号后的字符,所以逗号应该保留,但我们的操作是删除逗号后的字符,所以逗号应该保留在原位。但是上面的替换命令会删除逗号,因为我们没有在分组1中保留逗号。 所以我们需要重新设计:我们匹配最后一个逗号以及其后的所有字符,然后替换为最后一个逗号?不行,因为这样就会把整个匹配部分替换成一个逗号,而我们想保留逗号之前的内容。 正确的方法:我们匹配最后一个逗号后的所有字符(不包括逗号),然后将其替换为空。但是如何只匹配最后一个逗号后的部分? 我们可以使用:`%s/,\zs.*$//` 解释: - `,` 匹配逗号 - `\zs` 表示匹配的开始位置从这里开始,所以之前匹配的逗号不会被包含在匹配中(即我们匹配的是逗号之后的内容) - `.*$` 匹配从逗号后直到行尾的所有字符 - 替换为空字符串,即删除这些字符 这样,我们就删除了每行最后一个逗号后的所有字符(保留逗号)。 但是,如果一行中没有逗号,这个命令会怎样?它会匹配失败,所以不会做任何操作,这是安全的。 方法2:使用普通模式命令(针对当前行) - 我们可以按`0`到行首,然后按`f,`查找逗号,但是这样只能找到第一个逗号,我们需要最后一个- 我们可以按`$`到行尾,然后按`F,`反向查找逗号,这样找到的就是最后一个逗号(如果存在的话)。 - 然后按`d$`删除从当前位置到行尾的字符。 但是,如果我们想对整个文件进行操作,我们可以用宏(macro)或者使用:normal命令。 使用:normal命令: - `:%normal $F,d$` 解释:对每一行执行以下操作:`$`到行尾,`F,`反向查找逗号(找到最后一个逗号),然后`d$`删除到行尾。 - 但是注意:如果一行中没有逗号,`F,`会失败,那么`d$`就不会执行(因为命令会停在`F,`失败的地方),然后`d$`会删除从光标位置到行尾的内容,而光标位置可能不在行尾(因为`F,`失败时光标位置不变,即还在行尾),那么`d$`会删除空内容(即没有效果)。所以是安全的。 但是,如果一行中有逗号,那么`F,`会将光标移动到最后一个逗号处,然后`d$`会删除从该逗号到行尾的内容(包括逗号?不,因为`F,`将光标移动到了逗号上,然后`d$`删除从逗号(包括逗号)到行尾的内容。而我们只希望删除逗号后的内容(不包括逗号)。所以这样会多删除了逗号。 因此,我们需要在删除之前将光标移动到逗号之后的一个字符。所以修改为: - `:%normal $F,lld$` 或者 `:%normal $F,ld$` 解释:在找到逗号后,按`l`向右移动一个字符(这样光标就在逗号后面),然后`d$`删除到行尾(不包括逗号)。 但是,如果逗号是行尾的最后一个字符,那么按`l`会失败(因为已经在行尾,无法右移),那么`d$`就不会执行(因为命令被中断)。所以我们需要确保在逗号不是最后一个字符时才删除。 或者,我们可以使用`t`命令:`:%normal $F,dt$`,但是`dt$`实际上没有意义,因为`t$`会匹配到行尾,而`t$`是无效的(因为`t`命令需要一个字符参数)。所以不行。 另一种方式:使用`f,`然后删除之后的内容,但是我们需要最后一个逗号,所以还是用`F,`。 更安全的方式:使用替换命令。 综上所述,使用替换命令更简单且安全:`%s/,\zs.*$//` 但是,如果一行中有多个逗号,我们只删除最后一个逗号后面的内容。这个命令可以做到。 所以,我们推荐使用替换命令: - 在命令模式下输入:`:%s/,\zs.*$//` 注意:`\zs`是Vim的原子,用于指定匹配的起始位置。这样,逗号本身不会被包含在匹配中,所以替换为空字符串时,逗号会被保留。 如果用户想对选定的行进行操作,可以先选择范围,然后输入:`:'<,'>s/,\zs.*$//` 因此,回答如下:</think>在 Vim 编辑器中删除每行最后一个逗号后的字符,可以通过以下方法实现: ### 方法 1:使用替换命令(推荐) ```vim :%s/,\zs[^,]*$// ``` - **分解说明**: 1. `,`:匹配逗号 2. `\zs`:重置匹配起始位置(保留逗号不删除) 3. `[^,]*`:匹配逗号后所有**非逗号字符** 4. `$`:匹配行尾 5. 替换为空:删除匹配内容 - **效果**:保留最后一个逗号,删除其后的所有字符 `示例行:abc, def, ghi, jkl → 执行后:abc, def, ghi,` ### 方法 2:使用普通模式命令 ```vim :%normal $F,ld$ ``` - **分解说明**: 1. `$`:跳转到行尾 2. `F,`:反向搜索最后一个逗号 3. `l`:右移光标到逗号后 4. `d$`:删除到行尾 - **限制**:若逗号在行尾时可能无效 ### 方法 3:可视化块模式(适用于少量行) 1. `Ctrl + V` 进入块模式 2. 选中逗号后区域 3. `d` 删除 ### 示例演示 原始文本: ``` apple, banana, cherry, date cat, dog, elephant ``` 执行 `:%s/,\zs[^,]*$//` 后: ``` apple, banana, cherry, cat, dog, ``` ### 注意事项 1. **无逗号的行**:命令会自动跳过 2. **全局操作**:`%` 表示全文范围,可替换为行号(如 `:10,20s/...`) 3. **确认替换**:添加 `c` 标志(`%s/...//c`)逐行确认 这些方法均基于 Vim 的正则表达式命令模式特性,能高效处理批量文本操作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值