我有一个包含以下内容的文件:
test
Test
目前,如果我想用“foo”替换所有的“test”,并将“Test”替换为“Foo”,我需要使用两个命令:
:%s/test/foo/g
:%s/Test/Foo/g
有没有一种方法可以用单个命令完成这个任务?
我有一个包含以下内容的文件:
test
Test
目前,如果我想用“foo”替换所有的“test”,并将“Test”替换为“Foo”,我需要使用两个命令:
:%s/test/foo/g
:%s/Test/Foo/g
有没有一种方法可以用单个命令完成这个任务?
%Subvert/{t}est/{f}oo/g
或者 %Subvert/test/foo/g
命令即可轻松完成。(感谢评论区提供的信息)%s/\(test\|Test\)/\=submatch(0) =~ '^\l.*' ? 'foo' : 'Foo'/g
解释:
%s/
在整个缓冲区中进行替换
\(test\|Test\)/
匹配 'test' 或 'Test'
\=
使替换字符串使用后面表达式的计算结果
submatch(0)
在这个上下文中,计算结果为整个匹配表达式
=~ '\l.*'
字符串比较正则表达式匹配(以小写字母开头的单词)
... ? 'foo' : 'Foo'
if-then-else 表达式,如果 ... 为真,则计算结果为 'foo',否则为 'Foo'
/g
在整行中执行此操作
稍作修改后,这应该足够满足我们的需求。参考资料:
:help :s
:help :sub-replace-\=
:help expression
test
和 TEST
进行了测试,然后在这里进行了修改以更好地符合问题,但没有重新测试。只要“小写选项”中没有大写字母,你的解决方法就有效。否则,对于匹配,我猜指示“以小写字母开头”应该是正确的,即 ^\l
(或 ^\u
表示大写)。我已更新我的答案。 - Nathan Chappelltest
和TEST
进行了测试,然后在这里进行了修改以更好地匹配问题,但没有重新测试。只要“小写选项”中没有大写字母,你的解决方法就能起作用。否则,对于匹配,我猜指示“以小写字母开头”应该是正确的,即^\l
(或对于大写字母是^\u
)。我已经更新了我的答案。 - undefined
:%s/test/foo/g | %s/Test/Foo/g
。 - Darragh Enright