如何删除vim中每行的最后一个单词?

时间:2014-04-23 06:30:34

标签: vim

请告诉我,如何使用vim命令从每行删除最后一个单词? 之前:

abcdef 123
xyz 1256
qwert 2
asdf 159

之后:

abcdef
xyz
qwert
asdf

同样请告诉我如何使用vim命令从每行中删除第二个单词?

4 个答案:

答案 0 :(得分:10)

使用以下正则表达式(在ex模式下):

%s/\s*\w\+\s*$//

这告诉它找到可选的空格,后跟一个或多个单词字符,后跟可选的空格,后跟行尾 - 然后替换为空。

答案 1 :(得分:8)

这个问题已经得到了解答,但这是我最终可能会做的事情:

录制宏:
qq将宏记录到寄存器“q”中 $转到行尾 daw删除单词
q停止录制

然后选择其余行:
j沿着一条线走下去 vG选择文件的末尾

并应用宏:
:norm @q


一些类似的替代方案:

:%norm $daw

qq$dawjq(请注意添加的j)然后999@q多次重播宏。 (宏执行在第一个“错误”处停止 - 在这种情况下,您可能会触及文件的底部,j将无效,并且宏将停止。)

答案 2 :(得分:2)

关键是:substitute命令;它功能非常强大(常用于vi / Vim)。

您需要提供与您要删除的匹配的正则表达式模式。最后一句话,那就是空格(\s),一次或多次\+(或任何数字(*),取决于你想如何处理单字行),其次是通过 word 字符(\w\+),锚定到行尾($)。请注意, word 在Vim中具有特殊含义;您可能想要使用不同的原子(例如\S)。瞧:

:%s/\s\+\w\+$//

对于第二个单词,您可以使用为匹配断言的特殊\zs\ze原子,但实际上不匹配:在开头(^)锚定,匹配一个单词,然后开始匹配第二个:

:%s/^\w\+\s\+\zs\w\+\s\+//

很快,您还需要重新排序内容,而不仅仅是删除它们。为此,您需要知道捕获组\(...\)。然后可以在替换部分中引用与那些匹配的文本。例如,交换第一个和第二个单词:

:%s/^\(\w\+\s\+\)\(\w\+\s\+\)/\2\1/

有关详细信息,请查看帮助,尤其是:help :substitute:help pattern

答案 3 :(得分:1)

要从行的开头删除第二个单词,请使用以下内容:

:%s/^\(\s*\w\+\s\+\)\w\+\s*/\1/

<强>更新

要将特殊字符视为单词的一部分,您必须使用\S(与所有非空格字符匹配)而不是\w(仅匹配单词字符[0-9A-] ZA-Z_])。然后,命令将是:

:%s/^\(\s*\S\+\s\+\)\S\+\s*/\1/