Linux/Vim 如何查找替换匹配字符串时排除匹配内容的最后一个字符
单步实现方案
你可以直接使用Vim正则的捕获组功能实现单步替换,命令如下:
:%s/savings\([A-Za-z]\)/savings.\1/g
命令逻辑说明
\([A-Za-z]\)是正则捕获组,会匹配savings后面紧跟的1个英文字母,同时将这个字母暂存到标记\1中- 替换逻辑为:保留匹配到的
savings,在后面追加.,再把捕获到的字母\1拼接回去 - 该匹配逻辑只会命中
savings后接英文字母的场景,不会影响savings后接下划线的行,完全符合需求
通用场景下排除指定字符的替换方法
有两种常用的实现思路:
- 捕获组法:把需要保留的字符用
\(和\)包裹为捕获组,替换时通过\1、\2这类标记直接引用保留的内容即可,相当于间接排除了不需要修改的部分,这是兼容性最好、最通用的方案。 - 零宽边界标记法:可以用Vim正则里的
\zs(匹配起始位置)、\ze(匹配结束位置)标记实际需要替换的区间,标记外的内容只会作为匹配条件,不会被纳入替换范围,也能实现排除指定字符的效果。比如本次需求也可以写为:
这里:%s/savings\ze[A-Za-z]/savings./g\ze后面的[A-Za-z]仅作为匹配判断条件,不会被替换,也能达到同样效果。
内容的提问来源于stack exchange,提问作者Parm
相关产品推荐
相关产品推荐

