2016-10-16 3 views
0

У меня есть пример:поиск Vim и заменить

a, an [e, en] 
and [end] 
afraid [e'freid] 
... 

Можно ли искать только в скобках? И в этих письмах заменили? Я хотел бы объединить поиск с заменой>/\[.*\] и :%s/e/ə/gc.

ответ

4

Вы можете сделать это:

:%s/\[\zs.*\ze\]/\=substitute(submatch(0), 'e', 'ə', 'g')/ 

К сожалению, я не знаю, как получить /c работать там.

В качестве альтернативы,

:%s/\%(\[.*\)\@<=e\%(.*\]\)\@=/ə/gc 

Это один немного «грубой силы» и может работать медленнее на очень длинных линий.

+0

'/ c' действительно работал для меня строка мудрая ... – Sundeep

+0

первая может быть улучшена как' \ [\ zs [^]] * \ ze \] 'для ограничения соответствия внутри' [] 'only .. for ex : 'a, an [e, en] enable]' следует ли изменить 'e' в' enable'? – Sundeep

+0

@Sundeep Согласно исходному шаблону поиска OP, да. – melpomene

0

Один из способов (из командного режима):

:!perl -i -pe 'BEGIN{ sub f {$_ = shift; s/e/a/g; return "[$_]" }}; s/\[(.*?)\]/f($1)/e' % 
+0

Обнаружить определение подпрограммы в 'BEGIN {}' бессмысленно. – melpomene

+0

Ваша подпрограмма перезаписывает ('$ _ = shift') строку, которую вы сейчас заменяете в (' s /// '). Если это действительно работает, это, безусловно, не хороший стиль. – melpomene

0

My PatternsOnText plugin содержит команду :SubstituteInSearch (среди многих других). Это в основном упрощение ответа @ melpomene.

:%SubstituteInSearch/\[.*\]/e/ə/gc 
Смежные вопросы