Я могу сделать :%s/<search_string>/<replace_string>/g
для замены строки в файле, или :s/<search_string>/<replace_string>/
заменить в текущей строке.
Как выбрать и заменить слова из отдельных строк в vim?
Пример: заменить текст из строк 6-10
, 14-18
но не из 11-13
.
Ответы:
Команда
:&&
повторяет последнюю замену с теми же флагами. Вы можете предоставить ему дополнительные диапазоны (и объединить столько, сколько хотите):Если у вас много диапазонов , я бы предпочел использовать цикл:
источник
:6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&&
также будет работать,for
цикл сделает его более простым для запоминания и выполнения.:
На последующих команд не является обязательным, кстати, так что вы можете сэкономить еще несколько нажатий клавиш.:&&
спасет меня сотни нажатий клавиш в неделю. Спасибо!Заменить все:
Найдите каждое вхождение 'foo' (во всех строках) и замените его на 'bar'.
Для конкретных строк:
Измените каждое «foo» на «bar» для всех строк от строки 6 до строки 10 включительно.
источник
/
указываются флаги для операции. Эта команда обычно заменяет первое совпадение в строке; Сg
флагом это заменит все вхождения.%
Вещь делает работу! В противном случае, это только первый случай.%
=> запустить эту команду на всех строках.g
=> сопоставить несколько вхождений в одной строке.В качестве примечания, вместо того, чтобы вводить номера строк, просто выделите строки, которые вы хотите найти / заменить в одном из визуальных режимов:
VISUAL
режим ( V)VISUAL BLOCK
режим ( Ctrl+ V)VISUAL LINE
режим ( Shift+ V, лучше всего работает в вашем случае)После того как вы выбрали строки для замены, введите команду:
Вы заметите, что диапазон
'<,'>
будет вставлен автоматически для вас:Здесь
'<
просто означает первую выделенную строку и'>
означает последнюю выделенную строку .Обратите внимание , что поведение может быть неожиданным , когда в
NORMAL
режиме:'<
и'>
указывают на начало и конец последнего изюминкой сделано в одном изVISUAL
режимов. Вместо этого вNORMAL
режиме.
можно использовать специальный номер строки , который просто означает текущую строку . Следовательно, вы можете найти / заменить только текущую строку следующим образом:Следует также отметить, что вставка секунды
:
между диапазоном и командой find / replace не причиняет вреда, другими словами, эти команды будут работать:источник
Вы можете сделать это с двумя последовательностями поиска / замены
Во второй раз все, что вам нужно настроить, это диапазон, поэтому вместо того, чтобы вводить все, я вспомнил бы последнюю команду и отредактировал только диапазон
источник
В vim, если вы не уверены, какие строки будут затронуты, используйте ниже
Измените каждое «foo» на «bar», но сначала запросите подтверждение. Нажмите «y» для «да» и «n» для «нет». Не забудьте сохранить после этого
источник
c
флаг в дополнение к указанию диапазона, так что:6,10s/<search_string>/<replace_string>/c
работает.c
обозначаетconfirm
. Я используюc
флаг довольно часто, чтобы предотвратить случайную замену слов, где я не думал о том, что они там тоже существуют.VI поиск и замена примеров команд
Допустим, вы хотели бы найти слово под названием «foo» и заменить его на «bar».
Первый удар по
[Esc]
клавишеВведите: (двоеточие)
%s/foo/bar/
и нажмите клавишу [Ввод]:%s/foo/bar/
источник
:%s/<search_string>/<replace_string>/g
команда заменит все вхождения во всем файле. Не совсем ответ на вопрос, но, тем не менее, полезный :)Нам не нужно вводить текущий номер строки.
Если вы хотели бы изменить каждый
foo
вbar
течение текущей строки (.
) и два следующих строк (+2
), просто сделать:Если вы хотите подтвердить до внесения изменений, замените
g
наgc
:источник
:.,$s/foo/bar/gc
это поиск и замена, начиная с текущей строки и до конца файла.Поиск и замена
g => глобальный поиск
c => Сначала запросите подтверждение
я => без учета регистра
Если вы хотите прямую замену без подтверждения, используйте команду ниже
Если вы хотите подтверждение для каждой замены, выполните команду ниже
Сначала запросите подтверждение, здесь поиск будет без учета регистра.
источник
Задать диапазон с помощью визуального выбора можно, но когда есть очень простые операции с парой строк, которые могут быть выбраны оператором, лучше всего применять эти команды в качестве операторов.
К сожалению, этого нельзя сделать с помощью стандартных команд vim. Вы можете сделать своего рода обходной путь, используя! (фильтр) оператор и любой текстовый объект. Например, чтобы применить операцию к абзацу, вы можете сделать:
Это должно читаться как «Применить оператор! Внутри абзаца». Оператор фильтра запускает командный режим и автоматически вставляет диапазон строк, за которым следует буква "!" что вы можете удалить сразу после. Если вы примените это, к следующему абзацу:
Результат после нажатия "! Ap" будет выглядеть так:
Как "." (точка) означает текущую строку, диапазон между текущей строкой и пятью строками после будет использоваться для операции. Теперь вы можете добавить команду замены тем же способом, что и ранее.
Плохая часть в том, что это не проще, чем выбирать текст для последующего применения оператора. Хорошая часть заключается в том, что это может повторить вставку диапазона для других похожих текстовых диапазонов (в данном случае, абзацев) с заметно отличающимся размером. Т.е., если позже вы захотите выбрать диапазон большего абзаца, то '.' будет ли это правильно.
Также, если вам нравится идея использования семантических текстовых объектов для выбора диапазона операций, вы можете проверить мой плагин EXtend.vim, который может делать то же самое, но более простым способом.
источник
Чтобы ответить на этот вопрос:
:40,50s/foo/bar/g
замените foo на bar в этих строках между 40-й строкой и 50-й строкой (включительно), при выполнении этой команды вы можете в данный момент в любой строке.
:50,40s/foo/bar/g
также работает, vim запросит у вас подтверждение и затем заменит вас, как если бы вы ввели первую команду.
:,50s/foo/bar/g
замените foo на bar в этих строках между строкой, в которой вы находитесь, и 50-й строкой (включительно). (если вы находитесь в очереди ПОСЛЕ 50-й строки, vim снова запросит подтверждение)
Чтобы прояснить разницу между vim и плагином vrapper в Eclipse:
Обратите внимание, что в varpper
:,50s/foo/bar/g
Команда НЕ будет работать.:50,40s/foo/bar/g
будет работать без запроса подтверждения.(Для Vrapper версии 0.74.0 или старше).
источник
Предположим, если вы хотите заменить вышеупомянутое другой информацией.
COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)
В этом случае вышеприведенное будет заменено на (
sys.pkg.mpu.umc.kdk.
).источник
%s
для изменения ввода, но хочет знать, как сделать это «полуглобально» (т.е. его спецификация - строки 6-10 и 14-18, но не в строках 11- 13)./
, например!
,@
,_
::%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g