Можно ли использовать поиск и замену в подстановочной строке в 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 или онлайн о замене с помощью подстановочных строк. Самое большее, что я мог найти, это поиск подстановочных строк.
Ответы
Ответ 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/