Я видел другие вопросы иметь дело с нахождением энного возникновения слова/шаблона, но я не мог найти, как Вы на самом деле замените энным возникновением шаблона в энергии. Существует очевидный способ трудного кодирования всех случаев как
:s/.*\(word\).*\(word\).*\(word\).*/.*\1.*\2.*newWord.*/g
Существует ли лучший способ сделать это?
Вы можете сделать это немного проще, используя несколько поисковых запросов. Пустой шаблон в команде : s / pattern / repl /
означает замену самого последнего результата поиска.
:/word//word//word/ s//newWord/
or
:/word//word/ s/word/newWord/
Вы можете повторить это несколько раз, выполнив @:
или даже 10 @:
, чтобы повторить команду еще 10 раз.
В качестве альтернативы, если бы я делал это в интерактивном режиме, я бы сделал что-то вроде:
3/word
:s//newWord/r
Это обнаружит третье вхождение слова , начиная с курсора, а затем выполнит замену.
Для информации,
s/\%(\(pattern\).\{-}\)\{41}\zs\1/2/
также работает для замены 42-го вхождения. Однако я предпочитаю решение, данное Джоном Кугельманом , которое более простое - даже если оно не ограничивается текущей строкой.
Ну, если вы сделаете /gc
, то сможете посчитать, сколько раз он попросит вас подтвердить, и продолжить замену, когда дойдете до n-го :D