it-swarm.com.ru

Найти и заменить строки в vim на несколько строк

Я могу сделать :%s/<search_string>/<replace_string>/g для замены строки в файле или :s/<search_string>/<replace_string>/ для замены в текущей строке.

Как выбрать и заменить слова из отдельных строк в vim?

Пример: заменить текст из строк 6-10, 14-18, но не из 11-13.

245
mu 無

Команда :&& повторяет последнюю замену с теми же флагами. Вы можете предоставить ему дополнительные диапазоны (и объединить столько, сколько хотите):

:6,10s/<search_string>/<replace_string>/g | 14,18&&

Если у вас есть много диапазонов , я бы предпочел использовать цикл:

:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor
193
Ingo Karkat

Заменить все:

:%s/foo/bar/g

Найдите каждое вхождение 'foo' (во всех строках) и замените его на 'bar'.

Для конкретных строк:

:6,10s/foo/bar/g

Измените каждое «foo» на «bar» для всех строк от строки 6 до строки 10 включительно.

259
Jayanth Ramachandran

В качестве примечания, вместо того, чтобы вводить номера строк, просто выделите строки, которые вы хотите найти/заменить в одном из визуальных режимов:

  • VISUAL mode (V)
  • VISUAL BLOCK режим (Ctrl+V)
  • VISUAL LINE режим (Shift+Vработает лучше всего в вашем случае)

После того, как вы выбрали строки для замены, введите команду:

:s/<search_string>/<replace_string>/g

Вы заметите, что диапазон '<,'> будет вставлен автоматически для вас:

:'<,'>s/<search_string>/<replace_string>/g

Здесь '< просто означает первую выделенную строку , а '> означает последнюю выделенную строку ,.

Обратите внимание, что поведение может быть неожиданным, когда в режиме NORMAL: '< и '> указывают на начало и конец последнего выделения, выполненного в одном из режимов VISUAL. Вместо этого в режиме NORMAL можно использовать специальный номер строки ., который просто означает текущую строку . Следовательно, вы можете найти/заменить только текущую строку следующим образом:

:.s/<search_string>/<replace_string>/g

Следует также отметить, что вставка второго : между диапазоном и командой find/replace не причиняет вреда, другими словами, эти команды будут работать:

:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g
45
Attila O.

Вы можете сделать это с двумя последовательностями поиска/замены

  :6,10s/<search_string>/<replace_string>/g
  :14,18s/<search_string>/<replace_string>/g

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

27
Lieven Keersmaekers

VI поиск и замена примеров команд

Допустим, вы хотите найти слово под названием «foo» и заменить его на «бар».

Первое нажатие клавиши [Esc]

Введите: (двоеточие), затем %s/foo/bar/ и нажмите клавишу [Enter]

:%s/foo/bar/

11
arnav

В vim, если вы не уверены, какие строки будут затронуты, используйте ниже 

 :%s/foo/bar/gc  

Измените каждое «foo» на «bar», но сначала запросите подтверждение . Нажмите «y» для «да» и «n» для «нет». Не забудьте сохранить после этого

:wq
8
SMJ

Нам не нужно вводить текущий номер строки. 

Если вы хотите изменить каждую foo на bar для текущей строки (.) и двух следующих строк (+2), просто выполните:

:.,+2s/foo/bar/g

Если вы хотите подтвердить перед внесением изменений, замените g на gc

:.,+2s/foo/bar/gc
3
andykong10

Задать диапазон с помощью визуального выбора можно, но когда есть очень простые операции Всего за пару строк, которые могут быть выбраны оператором , Лучше всего применять эти команды как операторы.

К сожалению, этого нельзя сделать с помощью стандартных команд vim. Вы можете сделать своего рода обходной путь .__, используя! (фильтр) оператор и любой текстовый объект. Например, для применения операции к абзацу Вы можете сделать:

!ip

Это должно читаться как «Применить оператор! Внутри абзаца». Оператор фильтра Запускает командный режим и автоматически вставляет диапазон строк С последующим литералом "!" что вы можете удалить сразу после . Если вы примените это, к следующему абзацу:

1
2  Repellendus qui velit vel ullam!
3  ipsam sint modi! velit ipsam sint
4  modi! Debitis dolorum distinctio
5  mollitia vel ullam! Repellendus qui
6  Debitis dolorum distinctio mollitia
7  vel ullam! ipsam
8
9  More text around here

Результат после нажатия "! Ap" будет выглядеть так:

:.,.+5

Как "." (точка) означает текущую строку, диапазон между текущей строкой и пятью строками после будет использоваться для операции. Теперь вы можете добавить Команду замены тем же способом, что и ранее.

Плохая часть в том, что это не проще, чем выбирать текст для последнего , Применяя оператор. Хорошая часть заключается в том, что это может повторить вставку Диапазона для других аналогичных текстовых диапазонов (в данном случае, абзацев) с Заметно другим размером. То есть, если позже вы захотите выбрать диапазон больше Параграф '.' будет ли это правильно.

Кроме того, если вам нравится идея использования семантических текстовых объектов для выбора диапазона действия , Вы можете проверить мой плагин EXtend.vim , который может сделать то же самое , Но более простым способом ,.

0
Saul Axel Martinez Ortiz