Vi, заменить текст - PullRequest
       23

Vi, заменить текст

1 голос
/ 09 марта 2012

У меня есть такой текст

template
template
template_results
template

И мне нужно заменить его на

template_form
template_form
template_results
template_form

Как мне заменить каждое совпадение template, за которым не следует символ _ в Vi?

Я пробовал вот так

:%s/template[^_]/template_form    - Pattern not found
:%s/template\[^_]/template_form   - Pattern not found
:%s/template[_]/template_form     - This works, but the pattern is opposite of what I need

Спасибо:)

Ответы [ 3 ]

2 голосов
/ 09 марта 2012

Использовать отрицательный прогноз:

:%s/template\(_\)\@!/template_form/gc

Это означает, что любой "шаблон" не соответствует ни одному "_"

См .: :help /zero-width

2 голосов
/ 09 марта 2012

Вы пытаетесь указать шаблон, а затем ничего.Таким образом, хитрость заключается в том, чтобы использовать спецификатор конца строки $

:%s/template$/template_form/g

Первый не работает, потому что этот [^_] соответствует любому отдельному символу, кроме подчеркивания, но не никаким символам (или концулинии, видимо).

0 голосов
/ 09 марта 2012

Это легко в VIM, но придерживаясь того, что я СЧИТАЮ, чтобы быть в vanilla VI, вы можете сделать

:%s/template$/template_form/

Это предполагает, что за каждой строкой следует конец строки.Если нет, попробуйте:

:s/template\(\s\|$\)/template_form/

Я не знаю, подходит ли "магия" вашему вкусу VI, но это соответствует "шаблону", за которым следуют пробел или конец строки.

...