如何在 vim 中删除每个指定单词后的所有内容

如何在 vim 中删除每个指定单词后的所有内容

所以我有这个字符串

fruit banana
fruit apple
fruit grape
planet jupiter
planet mars
planet saturn

我想把这些字符串改成这样

fruit
fruit
fruit
planet jupiter
planet mars
planet saturn

问题是,我如何使用 vim 来做到这一点?

答案1

至少有 5 种方法可以做到:

替换

使用替换,你可以做很多事情(参见:help substitute)。其中之一是,你可以用捕获组记住第一个单词,方法是用 和 将该部分括起来\(\)匹配行的其余部分(但不记住它),然后使用 用记住的组替换行\1

:%s/\(fruit\).*$/\1/

将常规命令应用于一系列行

您可以指定想要影响的行,并提供要应用于每一行的正常模式命令(参见:help :normal):

:1,3norm Sfruit

这意味着,对于第 1 至 3 行,应用正常模式命令Sfruit,其中S 表示“删除行并开始插入”,然后您只需在该行上键入所需内容(参见:help S)。

使用全局命令

您还可以将普通命令应用于与某些模式匹配的行(请参阅:help global):

:g/^fruit/norm wd$

这仅适用于开头出现单词“fruit”的行(您可以想象其他场景中更复杂的模式)。正常模式命令wd$意味着:

w   " move cursor forward one word
d$  " delete until end of line

(尽管我们可以Sfruit再次使用)

使用宏

另一种方法是录制宏(参见:help macro),例如qa0wd$jq (注意它使用的方法与上面相同)。然后,您可以使用重放宏, @a并使用重复多次@@,或者使用将其应用于所有行:%norm @a(或者您可以使用范围/模式来指定行,如上所示)。分解如下:

qa  " start recording macro into the 'a' register
0   " move cursor to the beginning of the line      
w   " move cursor forward one word
d$  " delete until end of line
j   " move cursor down to the next line
q   " finish recording the macro

具有块选择功能

Ctrl您还可以通过使用+切换到可视块模式来选择您想要的单词 v(参见:help visual-block),使用常规 vim 动作突出显示您不想要的文件部分(您可以按将o光标放在选择块的另一个/对角),最后按d删除选定的内容。

相关内容