Подставить n-ное вхождение слова в vim - PullRequest
15 голосов
/ 19 июня 2010

Я видел другие вопросы, связанные с поиском n-го вхождения слова / образца, но я не мог найти, как вы на самом деле заменили бы n-е вхождение шаблона в vim.Существует очевидный способ жесткого кодирования всех случаев, таких как

:s/.*\(word\).*\(word\).*\(word\).*/.*\1.*\2.*newWord.*/g 

Есть ли лучший способ сделать это?

Ответы [ 5 ]

9 голосов
/ 19 июня 2010

Для информации

s/\%(\(pattern\).\{-}\)\{41}\zs\1/2/

также работает для замены 42-го вхождения.Однако я предпочитаю решение, данное Джоном Кугельманом , которое является более простым - даже если оно не ограничится текущей строкой.

7 голосов
/ 19 июня 2010

Вы можете сделать это немного проще, используя несколько запросов. Пустой шаблон в команде :s/pattern/repl/ означает замену самого последнего результата поиска.

:/word//word//word/ s//newWord/
or
:/word//word/ s/word/newWord/

Затем вы можете повторить это несколько раз, выполнив @: или даже 10@:, чтобы повторить команду еще 10 раз.

В качестве альтернативы, если бы я делал это в интерактивном режиме, я бы сделал что-то вроде:

3/word
:s//newWord/r

Это найдет третье вхождение word , начинающееся с курсора, а затем выполнит замену.

5 голосов
/ 27 августа 2017

Заменить каждое N th вхождение PATTERN в строке с REPLACE.

:%s/\(\zsPATTERN.\{-}\)\{N}/REPLACE/
1 голос
/ 26 июля 2017

Это отвечает на ваш фактический вопрос, но не на ваши намерения.

Вы спрашивали о замене n-го вхождения слова (но, похоже, оно означало "в пределах строки"). Вот ответ на вопрос в том виде, в котором он был задан, на случай, если кто-то найдет его, как я =)

Для странных задач (например, необходимость замены каждого 12-го вхождения "собака" на "попугай"), я люблю использовать рекурсивные записи.

Первая пустая запись в @ q

qqq

Теперь начните новую запись в q

qq

Далее, вручную сделайте то, что вы хотите сделать (используя приведенный выше пример, замените 12-е вхождение слова "собака" на "попугай"):

/dog
nnnnnnnnnnn

удалить "собаку" и попасть во вставку

diwi

тип попугай

parrot

Теперь проиграйте свою пустую запись "@q"

@q

, который ничего не делает.

Наконец, остановите запись:

q

Теперь ваша запись в @q вызывает себя в конце. Но поскольку он называет запись по имени , он больше не будет пустым. Итак, назовите запись:

@q

Будет воспроизведена запись, затем в конце, как последний шаг, снова воспроизведется сама. Это будет повторяться до конца файла.

TLDR;

qq
q
/dog
nnnnnnnnnnndiwiparrot<esc>
@q
q
@q
0 голосов
/ 19 июня 2010

Что ж, если вы сделаете /gc, вы можете посчитать, сколько раз он запрашивает у вас подтверждение, и продолжить замену, когда доберетесь до nth: D

...