42

例如,我有一堆具有共同前缀和后缀的值,例如:

fooVal1Bar;

fooVal2Bar;

fooVal3Bar;

在这种情况下,所有变量名称都以 . 开头和结尾,并以 .foo结尾Bar。我想使用在 和 之间找到的随机变量名称进行查找和foo替换Bar。假设我已经定义了变量Val1Val2Val3Val1OldVal2OldVal3Old。我会做一个替换,类似于:

:%s/foo<AnyString>Bar/foo<AnyString>Bar = <AnyString> + <AnyString>Old

这将导致:

fooVal1Bar = Val1 + Val1Old;

fooVal2Bar = Val2 + Val2Old;

fooVal3Bar = Val3 + Val3Old;

我希望很清楚我想要做什么,我在 vim 帮助或网上找不到任何关于用通配符字符串替换的内容。我能找到的最多的是搜索通配符字符串。

4

3 回答 3

64

我相信你想要

:%s/foo\(\w\+\)Bar/& = \1 + \1\Old/

解释:

\w\+找到一个或多个出现的字符。前面的foo和后面的Bar确保这些匹配的字符正好在 afoo和 a之间Bar

\(...\)存储此字符,以便它们可以用于替换的替换部分。

&复制匹配的内容

\1\(....\)部分中捕获的字符串。

于 2012-04-26T15:32:14.060 回答
7

您需要捕获要保存的内容。尝试这样的事情:

%s/\(foo\(\w\+\)Bar\);/\1 = \2 \2Old/

或者你可以用魔法把它清理一下:

%s/\v(foo(\w+)Bar);/\1 = \2 \2Old/
于 2012-04-26T15:34:57.200 回答
1

用通配符替换字符串

:%s/foo.*Bar/hello_world/gc

在这里,.*句柄通配符遵循正则表达式 有关正则表达式量词的更多信息

. - Any character except line break
* - Zero or more times
于 2020-09-25T14:50:57.410 回答