Можно ли использовать поиск и замену строки с подстановочными знаками в 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 или в Интернете о замене строками с подстановочными знаками. Максимум, что я смог найти, касался поиска строк с подстановочными знаками.


person dwcanillas    schedule 26.04.2012    source источник


Ответы (3)


Я верю, ты хочешь

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

объяснение:

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

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

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

\1 — это строка, захваченная в части \(....\).

person René Nyffenegger    schedule 26.04.2012
comment
есть ли разница между \w\+ и .*? - person dwcanillas; 26.04.2012
comment
\w\+ соответствует одному или нескольким из этого набора: a-zA-Z0-9_, а .* соответствует нулю или более чему-либо. - person gpojd; 26.04.2012
comment
Ах хорошо. Это имеет смысл. Спасибо! - person dwcanillas; 26.04.2012
comment
Только что попробовал код, который я хотел найти и заменить, и это сработало как шарм. еще раз спасибо! - person dwcanillas; 26.04.2012
comment
Если вы хотите сопоставить фиксированное количество вхождений, вы можете использовать \w\{n,m} или \w\{,m} для сопоставления с максимальным количеством вхождений. - person storm_m2138; 01.08.2018

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

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

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

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

Заменить строку подстановочным знаком

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

Здесь .* обрабатывает подстановочные знаки после регулярного выражения

. - Any character except line break
* - Zero or more times
person Daniel Selvan    schedule 25.09.2020