Подтвердить что ты не робот

Можно ли использовать поиск и замену в подстановочной строке в VIM?

Например, у меня есть набор значений с общим префиксом и постфиксным, например:

fooVal1Bar;

fooVal2Bar;

fooVal3Bar;

В этом случае все имена переменных начинаются и заканчиваются на foo и заканчиваются на Bar. Я хочу использовать поиск и замену, используя имена случайных переменных, найденные между foo и Bar. Скажем, у меня уже есть переменные Val1, Val2, Val3 и Val1Old, Val2Old и Val3Old Определены. Я бы нашел замену, что-то вроде:

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

Это приведет к:

fooVal1Bar = Val1 + Val1Old;

fooVal2Bar = Val2 + Val2Old;

fooVal3Bar = Val3 + Val3Old;

Я надеюсь, что он ясно, что я хочу делать, я не мог найти ничего в vim help или онлайн о замене с помощью подстановочных строк. Самое большее, что я мог найти, это поиск подстановочных строк.

4b9b3361

Ответ 1

Я считаю, что вы хотите

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

объяснение:

\w\+ находит одно или несколько вхождений символа. Предыдущие foo и следующая строка Bar гарантируют, что эти совпадающие символы находятся только между foo и a Bar.

\(...\) хранит эти символы, чтобы их можно было использовать в заменяющей части подстановки.

& копирует то, что было сопоставлено

\1 - это строка, записанная в части \(....\).

Ответ 2

Вам нужно захватить то, что вы хотите сохранить. Попробуйте что-то вроде этого:

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

Или вы можете немного очистить его с помощью magic:

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