你当然可以
:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/
附言。我猜keepcase.vim封装了一些类似的逻辑:)
:set ignorecase
时失败。 2. Bad
将替换为 GOOD
而不是 Good
。 3. 问题的“job
”部分被忽略,因此这也将替换 lambada
→ lamgooda
。在我的 answer 中对这些错误和其他一些内容进行了修复和解释。 (还有 LOLOWLs!)
对于大多数(非复杂)案例,我推荐 @rampion 的 answer 而不是我的。
如果您有时间,我的帖子可能仍然值得。提高您对脚本问题的认识。
你可以粘贴并修改它:(当然,如果你不时这样做,你会想要一个插件而不是这个怪物。但对于一些赶时间并且只需要一次的人来说,这是一个快速破解为了您的粘贴乐趣:)
:%s/\cbad\zejob/= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )
除了搜索模式之外,您还必须编辑替换代码中的四个'
字符串'
: 编辑 bold 中的部分:
:%s/\cbad\zejob/= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) 。 ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )
不要使用这个“橙色”版本进行粘贴,因为它的换行符也会破坏命令。
/\ze
是 vim 正则表达式语法糖,用于标记积极的前瞻:检查 \ze
之后的模式,但不替换。
https://i.stack.imgur.com/99eI5.jpg
is#
而不是 ==#
是另一种防御性编码方式:它提高了类型安全性:http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
在与字符串文字进行比较时应该使用它。
'single-quoted'
而不是 "double quoted"
strings 是另一个好的做法:http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings
HT @fc。 - 这个答案建立在他们的[答案](https://stackoverflow.com/questions/782511/case-preserving-substitute-in-vim/782617#782617)之上,修复了一些缺点。
如果您只匹配具有几个可能的大写字母的精确(不区分大小写)字符串,则另一种可能性是:
:s/abc/\={'abc':'xyz','Abc':'Xyz'}[submatch(0)]/i
keepcase 插件的替代方法是 SmartCase - replacing words while keeping original case。 (不要让自己因糟糕的收视率而气馁。)
:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig
之类的命令的乏味命令?
关于什么
:%s/\Cbadjob/goodjob/
:%s/\CBadJob/GoodJob/
:%s/\CbadJob/goodJob/
:%s/\CBADJOB/GOODJOB/
请参阅:https://stackoverflow.com/a/2287449/5599687
BadJob
之类的词,并且想用GoodJob
替换它,则不能使用%S/badjob/goodjob/g
。它无法检测到匹配。%S/BadJob/GoodJob/g
,然后 Subvert 命令将切换到混合大小写模式,并将执行 OP 给出的所有替换。%S
的参数中是否存在混合大小写激活混合大小写模式,或者输入参数BadJob
是否需要逐字匹配您要替换的内容?前者看起来很奇怪,后者似乎违背了目的。