vim поиск и добавление / изменение - PullRequest
0 голосов
/ 07 марта 2019

Есть ли способ найти текст в vim, а затем изменить, а не просто перезаписать указанный текст? то есть, если каждое вхождение соответствует определенному шаблону, я хотел бы заменить каждое вхождение уникальным текстом, частично основанным на символах рядом с вхождением, текстом, который соответствует шаблону.

В частности, я бы хотел сделать следующее: Я хотел бы заменить текст, который соответствует шаблону /\*.png на /\*.png alt=* title=\*, где * - это текст, который варьируется в каждом конкретном случае. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Вы можете заменить результаты на части совпадения, используя подспаривания.Например, скажем, у вас есть следующий html:

<img src="foo_one.png" />
<img src="bar_two.png" />

Вы можете выполнить эту команду:

:%s/"\(.\{-}\)\.png"/"\1.png" title="\1" alt="\1"/g

.\{-} будет соответствовать "любому количеству символов до .pngpart, 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большая тема.Я могу порекомендовать вам прочитать следующие разделы справки:

1 голос
/ 07 марта 2019

Вы можете использовать командную строку для этого.В Linux используйте sed.

sed -i 's/\.png/\.png alt=* title=*/g'

Здесь выполняется поиск по .png и замена на .png alt=* title=*.Вы должны использовать обратную косую черту перед.потому что это специальный символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...