【问题标题】:Find and Replace within selection in `vi`在“vi”中的选择范围内查找和替换
【发布时间】:2010-10-20 20:43:27
【问题描述】:

如何在vi 的选择中进行查找和替换?

【问题讨论】:

    标签: vim editor vi replace


    【解决方案1】:

    在可视模式下选择文本(我假设你正在这样做),然后按: 开始输入命令,你会在命令行中看到类似这样的内容:

    :'<,'>
    

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

    【讨论】:

    • 警告:该范围仅适用于行!如果您的选择仅包含一行的一部分,则搜索和替换将对整行起作用。获取部分行查找和替换需要编写脚本 afaik。
    • 我建议暂时将其移至另一行,进行替换,然后将其移回。
    • s/... 中的 s 代表什么?
    【解决方案2】:

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

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

    :%s/\%VSEARCH/REPLACE/g
    

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

    【讨论】:

    • 在视觉上选择行的一部分时,这是否适用于替换?我不能让它用返回替换空格。我选择了部分线路,他们使用:%s/\%V /\r/g 毫无乐趣。第一个空格被替换,但以下 4 个保持不变。
    • 我刚刚尝试过,它适用于我尝试过的所有情况,除了用 return 替换 ;-) 我认为这一定是因为第一个 replace 将选择分成一个新行,即不再在选择中。作为一种解决方法,您可以用唯一的字符串替换,例如EZ_REPLACE,然后进行全局搜索和替换...
    • 在宏中重新编码时效果不佳。在一系列行上重播宏不起作用。
    • @BradParks AFAIK,您需要\%VSEARCH%V 而不仅仅是\%VSEARCH
    【解决方案3】:

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

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

    如果您从可视模式进入命令行模式(通过按':'),VIM 将自动放置范围('&lt;,'&gt;)。

    【讨论】:

    • 理论上这应该按预期工作,但正如其他人指出的那样,实际上是替换标记&lt; 开始和&gt; 结束的行内的任何位置。也许它可以使它与\%'&gt; 原子一起工作。但我最初的实验失败了。
    【解决方案4】:

    【讨论】:

      【解决方案5】:

      Ex 命令的范围是按行指定的(请参阅*cmdline-ranges*),当在有视觉选择的同时按下: 时,命令行上的行范围会自动指定为'&lt;,'&gt;(请参阅*v_:*),这使得 :s[ubstitute] 命令在整行上运行,除非在搜索模式中使用 \%V 指定了视觉选择边界(参见 */\%V*),例如/\%Vvi\%Vm 仅在视觉选择中匹配“vim”,其中选择的结束在搜索模式结束之前指定,因为每个\%V 都指定下一个字符作为视觉选择的开始或结束,因此/\%Vvim\%V 需要在 'm' 之后继续进行视觉选择以匹配 "vim"。请注意,没有必要在搜索模式中使用第二个\%V,除非要求匹配项恰好位于视觉选择的边界或仅部分位于视觉选择中。

      【讨论】:

        【解决方案6】:

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

        :%s/foo/bar/g
        

        省略 g 进行本地替换。

        【讨论】:

        • 本地是当前行的本地
        猜你喜欢
        • 2018-12-28
        • 1970-01-01
        • 2013-04-21
        • 2017-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        相关资源
        最近更新 更多