在Vim/Neovim中为空格分隔列的指定数字批量加固定值
问题描述
尝试使用Vim命令
:s/\d\+/\=submatch(0)+8192为空格分隔格式的文件中某列数字批量加8192,但该命令会选中ATOM后的第二列数字。需要对第五列中从1开始的数字执行加操作,以延续8192的编号序列,文件结构示例如下:ATOM 32760 MW4 wate 8190 6.520 15.778 26.020 0.00 0.00 Mw4 ATOM 32761 OW1 wate 8191 6.550 20.128 25.950 0.00 0.00 O ATOM 32769 OW1 wate 1 17.610 8.049 75.290 0.00 0.00 O ATOM 32773 OW1 wate 2 16.200 7.639 85.230 0.00 0.00 O
解决方案
方法一:精准匹配第五列数字
使用以下Vim全局替换命令,仅针对第五列的数字执行加8192操作:
:%s/\v^(\S+\s+){4}(\d+)/\1\=submatch(2)+8192/
%:对所有行生效\v:开启非常魔法模式,简化正则写法^(\S+\s+){4}:匹配开头4个完整列(每个列由非空字符\S+和后续空格\s+组成)(\d+):捕获第五列的目标数字\1:保留前面4列的原始内容\=submatch(2)+8192:将捕获的数字加8192后替换原内容
方法二:仅修改小于8192的数字(避免误改已有序列)
如果需要避免改动第五列中已经是8190、8191、8192的行,可添加条件判断:
:%s/\v^(\S+\s+){4}(\d+)/\1\=submatch(2)<8192 ? submatch(2)+8192 : submatch(2)/
该命令会只对第五列中数值小于8192的数字执行加操作,其他数字保持不变,完美延续8192的编号序列。
内容的提问来源于stack exchange,提问作者Bussller
相关产品推荐
相关产品推荐

