我有一个文件,里面有这个:
test
Test
目前,如果我想用“foo”替换所有“test”,用“Foo”替换“Test”,我必须使用两个命令:
:%s/test/foo/g
:%s/Test/Foo/g
有什么方法可以用一个命令完成这个吗?
我有一个文件,里面有这个:
test
Test
目前,如果我想用“foo”替换所有“test”,用“Foo”替换“Test”,我必须使用两个命令:
:%s/test/foo/g
:%s/Test/Foo/g
有什么方法可以用一个命令完成这个吗?
我认为tim pope 的
这个vim 插件%Subvert/{t}est/{f}oo/g
可以解决你的问题,安装它或者%Subvert/test/foo/g
(感谢你的评论)会解决问题
正如我外公常说的,每个插件都有一个同样出色的 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/