我有一个文件里面有这个
test Test
目前,如果我想用'foo'替换'test'的所有情况,并用'foo'替换'Test',我必须使用两个命令:
:%s/test/foo/g :%s/Test/Foo/g
有没有什么方法可以用一个命令完成这个任务?
vyswwuz21#
我认为tim pope的这个vim plugin可以解决你的问题,安装它,%Subvert/{t}est/{f}oo/g或%Subvert/test/foo/g(感谢评论)就可以了。
%Subvert/{t}est/{f}oo/g
%Subvert/test/foo/g
hfsqlsce2#
就像我爷爷常说的,每个插件都有一个同样好的vim一行程序。试试看
%s/\(test\|Test\)/\=submatch(0) =~ '^\l.*' ? 'foo' : 'Foo'/g
说明:%s/替换整个缓冲区\(test\|Test\)/匹配“test”或“Test”\=使替换字符串使用以下表达式的计算结果submatch(0)在此上下文中计算为整个匹配的表达式=~ '\l.*'正则表达式匹配的字符串比较(针对以小写字母开头的单词)... ? 'foo' : 'Foo' if-then-else表达式,其计算结果为'foo' if...为真,否则为“Foo”/g在整行上执行此操作只要稍加修改,就足以满足我们的需要。参考文献:
%s/
\(test\|Test\)/
\=
submatch(0)
=~ '\l.*'
... ? 'foo' : 'Foo'
/g
:help :s :help :sub-replace-\= :help expression
...我只是想对任何试图进入vim评估和表达式的人提出一点警告...它们是非常违反直觉的(我来自C++背景,如果你来自bash或python,这可能不是问题)。我发现以下Vimscript指南/自学课程非常有帮助:http://learnvimscriptthehardway.stevelosh.com/
2条答案
按热度按时间vyswwuz21#
我认为tim pope的这个vim plugin可以解决你的问题,安装它,
%Subvert/{t}est/{f}oo/g
或%Subvert/test/foo/g
(感谢评论)就可以了。hfsqlsce2#
就像我爷爷常说的,每个插件都有一个同样好的vim一行程序。试试看
说明:
%s/
替换整个缓冲区\(test\|Test\)/
匹配“test”或“Test”\=
使替换字符串使用以下表达式的计算结果submatch(0)
在此上下文中计算为整个匹配的表达式=~ '\l.*'
正则表达式匹配的字符串比较(针对以小写字母开头的单词)... ? 'foo' : 'Foo'
if-then-else表达式,其计算结果为'foo' if...为真,否则为“Foo”/g
在整行上执行此操作只要稍加修改,就足以满足我们的需要。参考文献:
...我只是想对任何试图进入vim评估和表达式的人提出一点警告...它们是非常违反直觉的(我来自C++背景,如果你来自bash或python,这可能不是问题)。我发现以下Vimscript指南/自学课程非常有帮助:http://learnvimscriptthehardway.stevelosh.com/