我可以做一个交互式的:substuteute(搜索和替换)吗?


17

有时我使用:s复杂的正则表达式,它可能正确也可能不正确,或者不确定是否要替换所有匹配项。

我有什么办法可以告诉Vim在实际替换文本之前确认找到的所有匹配项?

Answers:


20

是! 将c标志用于:substitute。来自:help substitute

[c]     Confirm each substitution.  Vim highlights the matching string (with
        hl-IncSearch).  You can type:                           :s_c
            'y'     to substitute this match
            'l'     to substitute this match and then quit ("last")
            'n'     to skip this match
            <Esc>   to quit substituting
            'a'     to substitute this and all remaining matches {not in Vi}
            'q'     to quit substituting {not in Vi}
            CTRL-E  to scroll the screen up {not in Vi, not available when
                        compiled without the +insert_expand feature}
            CTRL-Y  to scroll the screen down {not in Vi, not available when
                        compiled without the +insert_expand feature}

用法示例很简单:

%s/old/new/c

这非常有用,但是直到2周前才知道:-)它甚至在ol'vi中也可用:-)

温馨提示:您可能还想使用:set nowrapscan; 这样可以防止Vim碰到底部时缠绕到顶部。我发现这在使用标志时特别有用c


19

除了Carpetsmoker所说的:

&incsearchset incsearchVim中()设置非常有用。您可以将其与一个有用的鲜为人知的技巧一起使用。

诀窍是仅使用/or ?命令来尝试复杂的正则表达式。Vim将使用&incsearch设置以交互方式显示匹配项。对正则表达式满意后,就可以使用:%s//replacementvim来使用以前的搜索。

请注意,其中的部分//是空白的(在此处您可以搜索文本)。如果您将其留空,则告诉Vim使用以前的搜索正则表达式。有了它,您可以输入一个复杂的正则表达式,/并具有以下所有优点set incsearch,然后使用%s//replacement命令实际执行搜索和替换。

如果您想要类似于incsearch的:s命令,请查看vim-over,但我只喜欢使用本机Vim方式。


我曾经使用过这样的变体:只需使用:%s/pattern/replace/然后按uundo,就可以看到Vim更改的部分(如果已hlsearch启用)。您可以再次用替换此文本^R
马丁·图尔诺伊

7

我最喜欢的交互式替换是使用搜索/并使用进行匹配n

然后选择使用匹配gn,然后s替代与任何我喜欢的文字。

重复进行至下一场比赛并按.


这是一个非常不错的技巧,因为它是:(1)交互式,(2)如果您不小心跳过了比赛(可以使用进行的操作:s/old/new/gc),则可以进行上一场比赛。
Ayrat


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.