2012-06-22 2 views
8

У меня была ситуация, когда я хотел заменить FOO на BAR через файл; однако, я хочу делать это только в определенных местах, например между строками 68-104, 500-537 и 1044-1195. На практике я уронил маркеры (MA, MB, MC, ...) на линиях, представляющих интерес, и я побежал следующее:Поиск и замена Vim - ограничить определенные строки

:'a,'b s/FOO/BAR/g | 'c,'d s/FOO/BAR/g | 'e,'f s/FOO/BAR/g 

мне пришлось повторить это десятки раз с различными поиска и замены терминов S/CAT/DOG и т. Д., Что стало больно, чтобы каждый раз переписывать командную строку. Мне повезло, что у меня было всего 3 места, которые я хотел ограничить своим поиском (представьте, было ли 30 или 40, как бесполезно получить командную строку).

Закодируйте функцию, есть ли какой-нибудь более простой способ сделать это?

Относительно примечания. Я скопировал FOO к «с» (поиск) регистрации и BAR к «г» (заменить) и попробовал командную строку

:'a,'b s/\[email protected]/\[email protected]/ | 'c,'d s/\[email protected]/\[email protected]/ | 'e,'f s/\[email protected]/\[email protected]/ 

Это спасло бы меня того, чтобы повторно написать в командной строке каждый времени, но, увы, это не сработало. Бит замены был штраф \ = @ r, но the \ = @ s в шаблоне поиска дал ошибку.

Любые советы будут оценены.

+0

Вы можете также использовать CONTROL-P и CONTROL -N (я думаю), чтобы перебирать предыдущие команды. Это должно устранить необходимость повторного ввода команд. – jahroy

+0

обычно принимает ответ, если это было полезно. – epsilonhalbe

ответ

2

Вместо использования маркера этот:

:68,104s/FOO/BAR/g << substitue from line 68 to 104

Это должно сделать работу немного проще и понятнее.

5

Если вам нужно выполнить набор линейных операций (например, замещения) на связке разных диапазонов линий, один трюк, который вы можете использовать, состоит в том, чтобы сделать эти строки различными, добавив префикс (то есть, t, разделяемый любой из других строк).

Способ, которым я обычно это делаю, состоит в том, чтобы отложить весь файл с чем-то вроде >G, выполненным в первой строке, а затем использовать команды :s/^ /X/ или блок-визуал, чтобы заменить ведущие пространства на X по строкам, которые я хочу.

Затем используйте :g совместно с :s. например:

:%g/^X/s/FOO/BAR/g 
:%g/^X/s/BAZ/QUUX/g 

Наконец, удалите временные префиксы.

+0

Я вижу, что вы на - помещаете временную метку в первом столбце для каждой строки моего диапазона. Это отличная идея. (К сожалению, в этом случае это не сработает, так как текстовый файл был исходным кодом, и я хотел скомпилировать его, когда я пошел.) –

+1

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

2

С q:, вы можете вспомнить предыдущие командные строки и редактировать их как обычный буфер Vim, так что вы можете быстро заменить FOO и BAR с чем-то еще, а затем повторно выполнить строку с Enter.

s/\[email protected]/\[email protected]/ не работает; как вы сказали, это работает только в запасной части. Но для шаблона, вы можете использовать Ctrl +RCtrl + Rs вставить содержимое регистра s, вместо \[email protected]. Предпочтительно использовать регистр по умолчанию, тогда это просто s//, но вы, вероятно, знаете это уже.

+0

Что означает _q: _? – jahroy

+0

Ах! Я не знал команду q: - хорошо! –

3

вдохновлен @ ответ ВДТ в:

Я не уверен, но вы можете написать все замены вниз в файле и источника, файл, который я думаю. substitutions.vim:

68,104s/FOO/BAR/g 
168,204s/FOO/BAR/g 
618,644s/FOO/BAR/g 
681,1014s/FOO/BAR/g 
. 
. 
. 
68,104s/BAZ/BOOO/g 
168,204s/BAZ/BOOO/g 

, а затем :so substitutions.vim может быть, вы также можете использовать это для нескольких файлов одной структуры. вы можете добавить e, чтобы добавить сообщение об ошибке игнорирования, если не ясно, что подстановки найдены в соответствующих строках строки.

+0

Да, это сработало бы. Я не знал флага «e» - спасибо. –

+0

для 'e' я должен предоставить реквизиты http://stackoverflow.com/questions/11146763/about-a-key-binding-to-remove-trailing-spaces-and-save/11146887#11146887 этот ответ на @ pb2q – epsilonhalbe

+0

ps Я только что попробовал это в тестовом файле, и он работает как шарм. Спасибо. –

2

При выполнении над закрытой складкой замены заменяются этой складкой.

  1. раза каждый регион
  2. поместить курсор на одну замкнутый раз
  3. выполнить замену: :s/foo/bar<CR>
  4. перейти к следующему закрыт свернуть с zj или zk
  5. использовать историю командной строки: :<C-p><CR> или :<Up><CR> для выполнения той же замены
  6. повтор ...

Вы также можете добавить флаг c в конце своей замещения, чтобы Vim запросил подтверждение перед его фактическим выполнением. Это может быть утомительно, если у вас много матчей.

4

Для того, чтобы избавиться от необходимости перепечатывать шаблон поиска, заместительную строку и флаги, можно просто использовать команду :& с & флагом:

:'a,'bs/pat/str/g|'c,'d&&|'e,'f&& 
+0

: & это новый на меня. Спасибо, это пригодится. –

+0

@ Дэйв: Это действительно удобно. Если я правильно понял вопрос, использование команды ': &' разрешает указанную проблему, не так ли? –

+0

В примере, который я дал, да, это отличное спасибо. Однако, если у меня было много мест, которые я хотел найти, я думаю, что ответ @ eipson-2-halbe может быть более практичным. Скажем, у меня было 40 местоположений, тогда поиск внешнего текстового файла может быть более управляемым, если положить 40 'xxx,' yyy && записей в командной строке. Комбинация обоих ваших методов - это, вероятно, путь! –

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