Vim不区分大小写搜索,但敏感替换

37

我有一个包含以下内容的文件:

test
Test

目前,如果我想用“foo”替换所有的“test”,并将“Test”替换为“Foo”,我需要使用两个命令:

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

有没有一种方法可以用单个命令完成这个任务?


我不确定这是否完全符合您的需求::%s/test/foo/g | %s/Test/Foo/g - Darragh Enright
是的,那个方法行得通,但不太有帮助,因为我想要加快进程。 - Jimmy Pitts
哈哈。是的... :) 通常我会这样做,但我对将其作为答案提供并不感到100%满意,因为它是Vim,可能有其他超级简洁和棒极了的解决方案。 - Darragh Enright
2个回答

16
我认为 Tim Pope 开发的这个 Vim 插件(vim-abolish)可以解决你的问题,安装后使用 %Subvert/{t}est/{f}oo/g 或者 %Subvert/test/foo/g 命令即可轻松完成。(感谢评论区提供的信息)

插件可以正常工作,尽管您只需要键入%Subvert / test / foo / g。 - Jimmy Pitts

13
正如我祖父常说的那样,对于每个插件,都有一个同样好用的 Vim 一行命令。试试看。
%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

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

1
抱歉因为一些奇怪的编辑。这个...咳咳,非常有用的网站不让我按照我想要的方式发布,所以我正在与它的格式化机制作斗争... - Nathan Chappell
1
这非常酷,但出于某种原因,只有在我使用\u而不是\l(然后交换冒号的两侧)时才能使其工作。当我使用\l时,它只会使用小写替代。 - NeRoboto
1
VIM - Vi IMproved 9.0(2022年6月28日,编译于2023年5月13日12:55:09) macOS版本 - arm64 - NeRoboto
1
@NeRoboto 谢谢你的指出 - 这很可能是我的错误(我在版本7.4、8.0和9.whatever上尝试过)。我相当确定我使用了字符串 testTEST 进行了测试,然后在这里进行了修改以更好地符合问题,但没有重新测试。只要“小写选项”中没有大写字母,你的解决方法就有效。否则,对于匹配,我猜指示“以小写字母开头”应该是正确的,即 ^\l(或 ^\u 表示大写)。我已更新我的答案。 - Nathan Chappell
1
@NeRoboto 谢谢你的指正 - 这很可能是我的错误(我尝试了版本7.4、8.0和9.whatever)。我很确定我使用了字符串testTEST进行了测试,然后在这里进行了修改以更好地匹配问题,但没有重新测试。只要“小写选项”中没有大写字母,你的解决方法就能起作用。否则,对于匹配,我猜指示“以小写字母开头”应该是正确的,即^\l(或对于大写字母是^\u)。我已经更新了我的答案。 - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接