В vim я иногда имею возможность заменить первые несколько совпадений в строке, но не каждый, как g
хотелось бы. например:
a a a a a
в
b b b a a
Я знаю, что мог бы использовать :s/a/b/[enter]:[up][enter]:[up][enter]
, но это достаточно утомительно в трех повторениях, у меня есть строки с потенциально более 10 заменами.
Я пытался:
:s/a/b/3g
: vim жаловался на висячих персонажей.:s/a/b/3
: изменяет первое вхождение в этой и следующих двух строках.3:s/a/b
: такой же, как предыдущий.:s/a/b/g3
: изменяет все вхождения в этой и следующих двух строках.:3s/a/b
: изменяет первое вхождение в строке 3.:/a/,3/a/s/a/b
: изменяет первое вхождение в каждой строке между следующейa
и третьей строкой, содержащейсяa
в файле (при необходимости запрашивая отмену).:/a/,/\([^a]*a\)\{3\}/s/a/b/
: изменяет первое вхождение в каждой строке между этим и следующим с 3a
с на нем (и это было бы нелегко расширить с помощью многосимвольного поиска).
И различные другие шаблоны адресации, ни один из которых не работал. Должен сказать, я довольно много узнал о :s
команде, пытающейся найти ответ на эту проблему, но я до сих пор не решил ее.
Кто-нибудь знает, как это сделать?
(бонусные баллы за определенный диапазон, например, со второго по четвертое)
n
и.
хотя я не думал использовать их здесь. Конечно, улучшение, спасибо.s/a/=something/
должен сделать трюк (:help sub-replace-=
). Я не достаточно свободно говорю на Vim, чтобы сразу писатьsomething
.:[up][enter]
можно заменить на&
, который все еще не идеален, но по крайней мере менее болезнен.Ответы:
Основываясь на
:s/pattern/replacement/gc
идее Samus_ (которая кажется наиболее простым способом обеспечения правильной работы, когда шаблон содержится в строке замены), заменить вхождения со 2-го по 4-е в одной строке:feedkeys()
это функция, которая вставляет строку ввода в очередь ввода с клавиатуры. Смысл в том, чтобы сделать предварительный подсчет, чтобы вам не пришлось беспокоиться о потере счета или прерывании.Для более общем случае, чтобы заменить МТЙ через N - й вхождения в одной строке для N больше или равно к очень большим М :
Замените M и N значениями, которые вы хотите (вы даже можете позволить
vim
сделать тривиальную ментальную арифметику, если вы не хотите делать это самостоятельно). Обратите внимание, что.
это оператор конкатенации строк VimL. Очевидно , что это только сохраняет нажатия клавиш для больших M . Если вы часто используете эту функцию, это может сэкономить ваше время, чтобы поместить вышеперечисленное в пользовательскую команду или функцию какого-либо рода, так как ее совсем немного набрать.источник
Для первого вопроса я бы сделал:
Во-вторых, хитрее, я не знаю, как сделать это автоматически, но вы можете сделать так, чтобы vim подсказывал вам о каждом совпадении так:
Затем вы отвечаете «нет» первым n совпадениям и «да» остальным.
источник
c
, что это может быть лучшим предложенным решением. Мне все еще нужно сосчитать, но я думаю, что это первый вариант, который будет работать с заменами, которые содержат строку поиска.источник
Я думаю, что это может работать, замените сначала, затем повторите 2 раза:
источник