【发布时间】:2011-06-03 09:30:21
【问题描述】:
我知道在 VIM 中如何搜索字符串并删除文本直到行首/行尾,但我想知道是否也可以在突出显示的搜索模式之前或之后删除行中的所有文本。
【问题讨论】:
我知道在 VIM 中如何搜索字符串并删除文本直到行首/行尾,但我想知道是否也可以在突出显示的搜索模式之前或之后删除行中的所有文本。
【问题讨论】:
如果您想在所有行中执行此操作并且不想重新输入您的搜索词,我建议您执行以下操作:
:%s/.*\ze<Ctrl-r>///
这是做什么的:
%s/:替换文件中的所有行.*:匹配任意字符\ze:结束匹配,因此模式的其余部分不会被替换<Ctrl-r>/:从“/”寄存器(即搜索寄存器)插入文本//: 替换为空编辑:忘记了后面的部分。我建议同时删除两者:
:%s/.*<Ctrl-r>/.*/<Ctrl-r>//
【讨论】:
:%s/.*\ze<Ctrl-r>/// 工作正常。你知道如果一行有2个匹配怎么办,如何选择第一个匹配或最后一个匹配?
删除同一行 FOO 之前的文本:
:s/^.*\(FOO\)/\1/
【讨论】:
:s/\(FOO\).*$/\1/。 ( 必须转义。
从行首到突出显示的搜索模式的开头:0dn
从突出显示的搜索模式末尾到行尾:$N//e<Enter>lD
这些在大多数情况下都有效。
【讨论】:
ggqqqqq//b<Enter>$N//e<Enter>lD<Enter>0@qq@q。但同样,太简单了,无法在所有情况下工作;在某些极端情况下会达不到要求。 @Randy Morris 的答案包含 设计 的工作方式,因此如果您想对多行而不是单个特定行执行更改,您肯定会想要使用它。跨度>
我无法评论其他答案,所以我在这里回答,但我指的是xofon的回答: 只需在命令行中添加一个 '%' 即可,这将适用于文件中的所有行。
删除所有行中']'之后的所有字符
:%s/\(\]\).*$/\1/
删除文件中所有行中'-'之前的所有字符
:%s/^\( -- \).*/\1/
【讨论】:
要在搜索匹配之前和之后删除行中的所有文本,您也可以这样做:
:g//norm gnd0PlD
这会在与最后一个搜索模式匹配的所有行上执行正常模式命令。命令是gn 选择匹配,d 删除它,0P 将其粘贴到行首,l 向左移动(在刚刚粘贴的文本之后)和@ 987654326@ 删除直到行尾。我知道gn 是最近添加到 vim 的,所以 YMMV。
【讨论】: