目标
最近编辑文本的时候,希望把 “start_position_lat” 形式的文本修改成 “startPositionLat” 。 Vim/NeoVim 的替换功能(Substituion)提供了修改原文本大小写的方法。
解决方案
替换的命令的一般形式为:
:[range]s[ubstitute]/{pattern}/{string}/[flags]
在使用修改大小写的功能需要在 {string} 部分使用如下控制符。
- \U - 将该字符后的所有内容修改成大写。
- \L - 将该字符后的所有内容修改成小写。
- \u - 将该字符后的第一个字符修改成大写。
- \l - 将该字符后的第一个字符修改成大写。
- \e 或 \E - 大小写转换终止符。
用上面的例子来演示一下如何使用这些控制符:
:%s/_\(\S\)/\U\1/g
该命令会将“start_position_lat”, 替换成"startPositionLat"。 该命令分成两个部分:
- _(\S) 正则匹配模式。匹配"_p" 和 "_l" 这样的文本。并将"_"后的第一个字符分成一组(group),方便后续使用 \1 来引用。
- \U\1 替换的目标字符串。 \1 代表 "_"后的第一个字符,这个例子中就是 p和l。 \U 表示将后续 \1 中的所有字符转换成大写。
所以该命令,可以将_p 替换成 P, _l 替换成L。
任务达成了!我们再举一些例子来演示更多功能。
再来一个例子
假设 要将 AbcLast@Sina.com 替换成 abclast@Sina.com。 在这个例子中需要使用 \e ( \E 也可以)来终止转换。所以最后可行的命令如下:
:%s/\(\S\+\)\(@\S\+\)/\L\1\e\2/g
- {pattern}部分将@前的字符分成一组,@及以后的字符分成一组。分别用 \1 和 \2引用。
- {string}部分,通过\L表示开始将后续的文本全部转换成小写,在本例中也就是“AbcLast”。 其次通过 \e 结束转换成小写。所以\2 所代表的"@Sina.com"就保持原样。 最终达成我们的目的。
另外录制了一个演示视频,可以看一下实际操作效果NeoVim/Vim替换时修改大小写演示视频