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

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

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

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

Ответ 1

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

: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

Ответ 2

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

:%s/foo/bar/g

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

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

:6,10s/foo/bar/g

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

Ответ 3

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

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

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

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

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

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

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

:%s/foo/bar/

Ответ 6

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

 :%s/foo/bar/gc  

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

:wq

Ответ 7

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

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

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

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

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

Ответ 8

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

К сожалению, этого нельзя сделать с помощью стандартных команд 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, который может делать то же самое, но более простым способом.

Ответ 9

/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal

Предположим, если вы хотите заменить вышеперечисленное другой информацией.

COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)

В этом выше будет заменено на (sys.pkg.mpu.umc.kdk.).