【问题标题】:Substitute partial line in vim using only substitute command仅使用替换命令替换 vim 中的部分行
【发布时间】:2014-04-29 05:34:14
【问题描述】:

我正在编辑一个文件,其行类似于以下内容:

{"a_function", a_function},
{"a_second_function", a_second_function},

我想将下划线转换为空格,但只能在引号内。有没有办法通过使用:substitute 命令来做到这一点?我知道我可以通过录制宏来做到这一点,并且可能有插件可以做到这一点,但为了聪明,我想用:substitute 命令一次性完成。

【问题讨论】:

  • 文字总是这样重复吗? {"x", x}, {"y", y} 等等?
  • 在这种特殊情况下,文本以该模式重复。不过,我还有其他地方可能不是这样。看起来我的问题实际上可能与其他问题重复。我将不得不审查。

标签: vim


【解决方案1】:

这个命令应该做你想做的:

:%s/\v(".{-}")/\=substitute(submatch(1), "_", " ", "g")

我捕获每行的第一对引号,然后将其用作替换,并删除所有下划线。

【讨论】:

  • 基于我使用的链接问题:%s/"\zs\(\w*\)\ze"/\=substitute(submatch(1), '_', ' ', 'g')/g\=subsitute() jazz 是我的 vim 曲目中缺少的。
  • 只是好奇。该模式与"[^"]*" 有何不同?
  • @RSahu,这只是实现相同目标的不同方式。
【解决方案2】:

另一种方法是在可视块模式下选择要操作的文本,然后做

:'<,'>s/\%V_/ /g,它只会在可视区域中替换。

这既简单又快速,但不那么灵活且并不总是可行的。


但有时精心创建的正则表达式模式也是一种选择。

在您的简单示例中,这就足够了:s/\v_(\S*")@=/ /g

【讨论】:

    【解决方案3】:
    :%s/\(".*\)_\(.*"\)/\1 \2/g
    

    每次调用时,它将替换所有文档中的一个下划线。因此,如果引号之间最多有 5 个下划线,则只需调用 5 次即可。

    【讨论】:

    • 不错的主意。在我链接的您可能喜欢的问题中,有一些使用子匹配的更简单的解决方案。
    【解决方案4】:

    我的PatternsOnText plugin 提供了一个:SubstituteInSearch 命令。使用它,您首先搜索带引号的字符串,然后仅在匹配项中执行 :substitute

    /".\{-}"
    :SubstituteInSearch/_/ /g
    

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 2021-07-17
      • 1970-01-01
      • 2014-03-22
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2011-10-19
      相关资源
      最近更新 更多