请告诉我,如何使用vim命令从每行删除最后一个单词? 之前:
abcdef 123
xyz 1256
qwert 2
asdf 159
之后:
abcdef
xyz
qwert
asdf
同样请告诉我如何使用vim命令从每行中删除第二个单词?
答案 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/