Vi,替换文字

时间:2012-03-09 08:20:09

标签: replace vi

我有这样的文字

template
template
template_results
template

我需要将其替换为

template_form
template_form
template_results
template_form

如何替换Vi中未跟template个字符的_的每个匹配项?

我试过这样的

:%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 个答案:

答案 0 :(得分:2)

使用否定前瞻:

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

这意味着匹配任何“模板”未跟随(\@!)任何“_”

请参阅::help /zero-width

答案 1 :(得分:2)

您正在尝试指定模板,然后没有。 所以诀窍是使用行尾说明符$

:%s/template$/template_form/g

第一个不起作用,因为此[^_]匹配除下划线以外的任何单个字符,但不匹配任何字符(或显然是行尾)。

答案 2 :(得分:0)

这在VIM中很容易,但坚持我认为的香草VI,你可以做到

:%s/template$/template_form/

这假设每行后面都有一行结束。如果没有,请尝试:

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

我不知道“魔法”是否适合您的VI风格,但这与“模板”匹配后跟空格或行尾。