【问题标题】:Search and replace in vim in specific lines在 vim 中的特定行中搜索和替换
【发布时间】:2017-03-22 23:49:26
【问题描述】:

我可以使用

:5,12s/foo/bar/g

在第 5 行和第 12 行之间搜索 foo 并将其替换为 bar。我怎样才能仅在第 5 行和第 12 行中执行此操作(而不是在其间的行中)?

【问题讨论】:

    标签: vim


    【解决方案1】:

    Vim 有特殊的正则表达式原子,可以匹配某些行、列等;您可以使用它们(可能除了范围之外)来限制匹配:

    :5,12s/\(\%5l\|\%12l\)foo/bar/g
    

    :help /\%l

    【讨论】:

    • 一种比我预期更复杂的方法,但完美地回答了我的问题。谢谢!
    【解决方案2】:

    您可以在第 5 行进行替换,然后在第 12 行以最小的努力重复:

    :5s/foo/bar
    :12&
    

    正如 Ingo 所指出的,:& 忘记了你的标志。由于您使用的是/g,因此正确的命令应该是:&&

    :5s/foo/bar/g
    :12&&
    

    :help :& 和朋友。

    【讨论】:

    • +1 用于使用不起眼的 :&。如果有标志(s/../../g),则必须使用:&&,不过...
    • @IngoKarkat,公平地说,我认为\(\%5l\|\%12l\):& 更晦涩难懂
    【解决方案3】:

    您始终可以在末尾添加c。这将要求对每场比赛进行确认。

    :5,12s/foo/bar/gc
    

    【讨论】:

    • 如果在第 5 行和第 12 行之间有很多匹配项,这可能是一场噩梦(请记住,有一个 g 标志在起作用)
    • @doubleDown 这并不是一个通用的解决方案(有很多可能的候选者),但在大多数情况下,你真的认为按 n 5 或 6 次比在替换语句中添加\(\%5l\|\%12l\)
    • 我觉得这很有用,我想改变每隔一行,这会比我最终做的更快。
    【解决方案4】:

    有趣的问题。好像只有范围选择,没有多行选择:

    http://vim.wikia.com/wiki/Ranges

    但是,如果您在第 5 行和第 12 行有什么特别之处,您可以使用 :g 运算符。如果您的文件看起来像这样(数字仅供参考):

     1     line one
     2     line one
     3     line one
     4     line one
     5     enil one
     6     line one
     7     line one
     8     line one
     9     line one
    10     line one
    11     line one
    12     enil one
    

    并且您想在有enil 而不是line 的行上将one 替换为eno

    :g/enil/s/one/eno/
    

    【讨论】:

    • 这实际上是假设很多
    【解决方案5】:

    您可以使用ed - 一个面向行的文本编辑器,具有与 vi 和 vim 类似的命令。它可能早于 vi 和 vim。

    在脚本中(使用处理输入直到 EndCommand 标记的 here 文档)它看起来像:

    ed file <<EndCommands
        5
        s/foo/bar/g
        7
        s/foo/bar/g
        wq
    EndCommands
    

    显然,ed 命令也可以在命令行中使用。

    【讨论】:

    • 我认为与 vim 替代方案相比没有优势。
    • Vim 也可以这样做;这些数字实际上可以放在:s 之前,但仍然存在:s 命令的重复(这是 romainl 的解决方案避免的)。
    • 我的观点是用户可能想要选择多于两行进行编辑。在这种情况下,可能会感兴趣的非交互式方法 - AFAIK 无法使用 vim 完成。
    • 哦,Vim 可以做到这一点(例如,在“Ex”模式下),但你说得对,应该首选其他工具而不是交互式编辑器。我的偏好是sed,不过...
    猜你喜欢
    • 1970-01-01
    • 2019-01-03
    • 2011-11-09
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2015-02-15
    • 2012-07-27
    • 2011-05-04
    相关资源
    最近更新 更多