替换匹配模式内的文本?

替换匹配模式内的文本?

使用任何流编辑器(或 vim),是否有一种快速、高效而简单的方法进行替换,但仅限于已经匹配的模式内。例如:

将所有参数“foo”替换为“bar”,但仅限于函数“func”:

test(foo, baz) func(foo) truc(foo) func(test, foo)

->

test(foo, baz) func(bar) truc(foo) func(test, bar)

首先搜索:/func\((.*)\)/

...然后,在捕获的组(或至少是完整匹配)中,执行s/foo/bar/g

注:我已阅读使用 sed 替换更大模式中的两个模式

但我正在寻找一种更简单的方法,不一定使用 sed

答案1

使用 Notepad++ 编辑器,它也可以与 SublimeText (至少 V3.0) 一起使用:

  • Ctrl+H
  • 找什么:\bfunc\([^)]*\K\bfoo\b
  • 用。。。来代替:bar
  • 取消勾选匹配大小写
  • 检查环绕
  • 检查正则表达式
  • Replace all

解释:

\bfunc\(    # literally func(, word boundary to avoid abcfunc
[^)]*       # 0 or more not closing parenthese
\K          # forget all we have seen until this position
\bfoo\b     # foo surrounded with word boundaries

给定示例的结果:

test(foo, baz) func(bar) truc(foo) func(test, bar)

相关内容