在“ vi”中的选择范围内查找并替换


Answers:


89

在可视模式下选择文本(假定您正在执行此操作),然后按:开始输入命令,您将在命令行中看到类似以下内容:

:'<,'>

这意味着该命令将应用于选择。然后输入s/search/replace/并按Enter。(g如果要替换所有匹配项,请在第三个斜杠后添加一个,c如果要对每次替换进行确认,则添加一个)


46
注意:该范围仅沿行方向有效!如果您的选择仅包含一行的一部分,则搜索和替换将在整行上进行。要查找和替换部分行,需要编写脚本afaik。
user55400

3
我建议暂时将其移到另一行,进行替换,然后再移回去。
本杰明·阿特金2014年

89

此处建议的大多数其他解决方案都适用于进行选择的ENTIRE线路,这可能不是您想要的。

要仅搜索和替换所选内容,请首先直观地选择文本,然后使用如下命令:

:%s/\%VSEARCH/REPLACE/g

这将进行搜索并仅在视觉选择的部分中进行替换,将SEARCH替换为REPLACE。如果您选择了多条线,那么它也将适用于多条线。


在视觉上选择线的一部分时,这应该代替吗?我不能让它用return替换空格。我正在选择部分线路,他们使用:%s/\%V /\r/g时没有任何愉悦感。第一个空格被替换,但随后的四个保持不变。
bentayloruk

我只是试过了,它对我尝试过的所有情况都有效,除了用return替换;-)我认为这一定是因为第一个替换将选择拆分为新行,该行不再包含在选择中。作为解决方法,您可以替换为唯一的字符串,例如EZ_REPLACE,然后进行全局搜索并替换为该字符串...
Brad Parks

在宏中重新编码时,播放效果不佳。在一系列的行上重播宏是行不通的。
PeterPerháč16年


@BradParks AFAIK,您\%VSEARCH%V不仅需要\%VSEARCH
Atralb

21

如果使用可视模式进行选择,则:

:'<,'>s/regex/replacement/options

'<,'>如果':'从可视模式进入命令行模式(按),则VIM会自动放置范围()。


1
从理论上讲,这应该可以按预期工作,但是正如其他人指出的那样,实际上是在标记<开始和>结束的行中的任何位置进行替换。也许可以使其与\%'>原子一起工作..但是我的最初实验失败了。
alpha_989


2

Ex命令的范围是按行指定的(请参阅*cmdline-ranges*),并且在:可视选择中按时,将在命令行上自动将行范围指定为'<,'>(请参见*v_:*),这会使:s[ubstitute]命令在整行上运行,除非视觉选择边界在搜索模式中用\%V(请参见*/\%V*)指定,例如,/\%Vvi\%Vm仅在视觉选择内匹配“ vim”,其中选择的结尾在搜索模式结束之前\%V指定,因为每个都将下一个字符指定为视觉选择的开始或结束,因此/\%Vvim\%V将要求视觉选择在“ m”之后继续以匹配“ vim”。请注意,使用第二个\%V 除非要求匹配在视觉选择的边界处或仅在视觉选择的一部分处进行匹配,否则不需要使用搜索模式。


-3

如果要进行全局搜索并替换文件中的所有实例(使用可选的正则表达式),我将执行以下操作:

:%s/foo/bar/g

省略g进行本地替换。


当地人是当前线路的本地人
Lazarus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.