2013-11-15 2 views
172

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

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

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

+1

См. Также [vim выбор/редактирование нескольких последовательных строк сразу] (http://stackoverflow.com/q/16439297). – glts

+0

http://vim.wikia.com/wiki/Search_and_replace – MrRolling

ответ

140

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

: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 
+32

+1 Почему я даже беспокоюсь ... –

+1

Спасибо. Примечание для будущих пользователей - ': 6,10s///g | : 14,18 && | : 20,23 && | : 28,31 && 'также будет работать, цикл' for' упрощает запоминание и выполнение. –

+2

Рад, что вам понравилось! ':' На последующих командах является необязательным, так что вы можете сохранить еще несколько нажатий клавиш. –

26

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

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

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

151

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

:%s/foo/bar/g 

Найти каждое вхождение 'Foo' (во всех линиях), и заменить его на 'бар'.

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

:6,10s/foo/bar/g 

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

+0

А как насчет строки 14-18? – Bernhard

+0

Вам нужно будет снова использовать ту же команду. Вим вспоминает, как правильно сказал @Lieven .. Спасибо. –

+0

Какова цель/g здесь? Извините, я новичок в Linux –

34

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

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

Как только вы выбрали строки для замены, пэ вашей команды:

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

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

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

'< Здесь просто означает первой линии маршрута и '> означает последнего выделенной строки.

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

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

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

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

> Пример: заменить текст из строк 6-10, 14-18, но не с 11-13. - не ваш ответ ответит на этот вопрос, не так ли? – poige

-3
/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.).

+0

Я не уверен, что это действительно отвечает на вопрос. Из вопроса, который, как представляется, человек спрашивает, уже знает, как использовать '% s' для изменения ввода, но хочет знать, как это сделать« полу-глобально »(т.е. его спецификация - строки 6-10 и 14-18, но не на строках 11-13). –

+1

И что такое «КОМАНДА»? И вы страдаете от синдрома [склонности к зубочистке] (https://en.wikipedia.org/wiki/Leaning_toothpick_syndrome). – Carpetsmoker

+0

Чтобы исправить этот синдром, вы можете использовать другой символ в качестве разделителя вместо стандартного '/', например. '!', '@', '_':':% s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g' – MortezaE

9

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

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

Первый удар [Esc] ключ

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

+4

Ваши ':% s/Команда //g' заменит все вхождения во всем файле. Не совсем ответ на вопрос, но полезный тем не менее :) – tanius

Смежные вопросы