34

我有一个文件,里面有这个:

test
Test

目前,如果我想用“foo”替换所有“test”,用“Foo”替换“Test”,我必须使用两个命令:

:%s/test/foo/g
:%s/Test/Foo/g

有什么方法可以用一个命令完成这个吗?

4

2 回答 2

14

我认为tim pope 的 这个vim 插件%Subvert/{t}est/{f}oo/g可以解决你的问题,安装它或者%Subvert/test/foo/g(感谢你的评论)会解决问题

于 2012-05-28T13:30:10.223 回答
7

正如我外公常说的,每个插件都有一个同样出色的 vim 单行。尝试

%s/\(test\|Test\)/\=submatch(0) =~ '\l.*' ? 'foo' : 'Foo'/g

解释:

%s/替换整个缓冲区

\(test\|Test\)/匹配“测试”或“测试”

\=使替换字符串使用以下表达式的计算结果

submatch(0)在这种情况下,计算为整个匹配的表达式

=~ '\l.*'正则表达式匹配的字符串比较(针对以小写字母开头的单词)

... ? 'foo' : 'Foo'if-then-else 表达式,如果 ... 为真,则为 'foo',否则为 'Foo'

/g在整条线上执行此操作

稍作修改,这应该足以满足我们的需求。参考:

:help :s
:help :sub-replace-\=
:help expression

...我只是想对任何试图进入 vim 评估和表达式的人发出一点警告...它们非常违反直觉(我来自 C++ 背景,也许如果你来自 bash 或 python,那就更少了一个问题)。我发现以下 vimscript 指南/自学课程非常有帮助:http ://learnvimscriptthehardway.stevelosh.com/

于 2019-02-09T16:24:07.907 回答