Vim中的大小写保留替换

x7yiwoj4  于 2023-06-30  发布在  其他
关注(0)|答案(8)|浏览(203)

this可以在Vim中实现吗?
我的意思是:搜索'BadJob'并替换为'GoodJob'将执行以下替换

'badjob' -> 'goodjob'  
'BadJob' -> 'GoodJob'  
'badJob' -> 'goodJob'  
'BADJOB' -> 'GOODJOB'
mgdq6dx1

mgdq6dx11#

使用abolish.vim

:%S/badjob/goodjob/g
0yg35tkg

0yg35tkg2#

我不知道这是不是你要找的解决办法。我用了这个:keepcase.vim
在vim中没有其他支持。

hujrc8aj

hujrc8aj3#

当然可以
:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/
我猜keepcase.vim封装了一些类似的逻辑:)

nsc4cvqm

nsc4cvqm4#

对于大多数(不复杂的)情况,我推荐@rampion的答案。
如果你有一分钟的时间,我的文章可能仍然是值得的。提高对脚本陷阱的认识。
您可以粘贴并调整以下内容:
(Of当然,如果你经常这样做,你会想要一个插件而不是这个怪物。但对于一些谁是匆忙,只需要一次,这是一个快速黑客为您的粘贴乐趣:)
:%s/\cbad\zejob/= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )
除了搜索模式之外,还必须在替换代码中编辑四个'字符串':编辑粗体部分:
:%s/\c错误\ze作业/=
(submatch(0)[0]是否为# toupper(submatch(0)[0])?'G':'g')。
(submatch(0)[1]是否为# toupper(submatch(0)[1])?'OOD':'ood')

  • 不要使用这个“橙子”版本进行粘贴,因为它的换行符也会中断命令。*

/\ze是vim regex的语法糖,用于标记一个积极的lookahead:检查\ze之后的模式,但不替换。
是#?让我解释一下...(如有兴趣)
#(也在==#和其他)强制区分大小写。否则,使用:set ignorecase(我使用它,因为这是有用的:set smartcase所必需的),vim将考虑'a' == 'A'!!

尽管这很疯狂,但我们确实应该解释一下:因为它依赖于用户设置,所以应该使用**==!**(除非这实际上是你想要的。)我甚至会遵循建议,在比较整数时使用==#:http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively
is#而不是==#是另一种防御性编码方式:它提高了类型安全性:http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
它应该在与字符串文字进行比较时使用。
'single-quoted'而不是"double quoted"字符串是另一个很好的实践:http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings
HT @fc. -这个答案基于他们的[答案](https://stackoverflow.com/questions/782511/case-preserving-substitute-in-vim/782617#782617),修复了一些缺点。

dgjrabp2

dgjrabp25#

如果你只匹配一个精确的(大小写无关的)字符串和几个可能的大写字母,另一种可能是:

:s/abc/\={'abc':'xyz','Abc':'Xyz'}[submatch(0)]/i
ltskdhd1

ltskdhd16#

什么事

:%s/\Cbadjob/goodjob/
:%s/\CBadJob/GoodJob/
:%s/\CbadJob/goodJob/  
:%s/\CBADJOB/GOODJOB/

参见:https://stackoverflow.com/a/2287449/5599687

5lhxktic

5lhxktic7#

qvsjd97n

qvsjd97n8#

当然,你可以这样做:
首先声明一些包含case和replacement的变量:
let a = ['badjob', 'BadJob', 'badJob', 'BADJOB']
let b = ['goodjob', 'GoodJob', 'goodJob', 'GOODJOB']
第二,应用for循环,如下所示:
for i in range(0,3) | exec '%s/' . a[i] . '/' . b[i] . '/g' | endfor
注意range函数从0开始。
最好的问候。

相关问题