Вы можете заменить результаты на части совпадения, используя подспаривания.Например, скажем, у вас есть следующий html:
<img src="foo_one.png" />
<img src="bar_two.png" />
Вы можете выполнить эту команду:
:%s/"\(.\{-}\)\.png"/"\1.png" title="\1" alt="\1"/g
.\{-}
будет соответствовать "любому количеству символов до .png
part, non-жадно "(:help /\{
) и скобки вокруг него, \(
и \)
помечают его как захваченную группу, которая затем будет использоваться в замене как \1
(первая захваченная группа).Выполнение этого дает вам:
<img src="foo_one.png" title="foo_one" alt="foo_one" />
<img src="bar_two.png" title="bar_two" alt="bar_two" />
Теперь, если вам нужна более сложная подстановка, например, превращение имени файла в удобочитаемую строку, вы можете использовать флаг подстановки \=
, чтобы заменить строку любойвыражение, как вызов функции.Например, вот что мы могли бы выполнить для приведенного выше текста:
:%s/title="\zs\(.\{-}\)\ze"/\=lib#CamelCase(submatch(1))/g
При этом используются два шаблона Vim: \zs
и \ze
.Это «начало матча» и «конец матча».Вещи, которые будут искать, это весь шаблон, title=...
.Однако, то, что будет заменено, это только между \zs
и \ze
.Это облегчает использование результата lib#CamelCase
в качестве прямой замены.
Обратите внимание, что на этот раз вам не нужны скобки \(
/ \)
, потому что вы можете просто использовать submatch(0)
для «полного соответствия»:
%s/title="\zs.\{-}\ze"/\=lib#CamelCase(submatch(0))/g
Функция lib#CamelCase
- это моя собственная функция, которая реализована следующим образом:
function! lib#CamelCase(word)
return substitute(a:word, '_\(.\)', '\U\1', 'g')
endfunction
Вы можете написать любую функцию, которая требует некоторого ввода ивозвращает заменяющую строку, делая все, что вам нужно.
Я не уверен, каков ваш уровень опыта работы с Vim и регулярными выражениями, поэтому сложно дать конкретный совет, а замены Vimбольшая тема.Я могу порекомендовать вам прочитать следующие разделы справки: