在 Vim 搜索和替换中将变量与子匹配组合在一起



我有几行与此类似的行:

insert into team (lowernum, uppernum, position, color1, color2) values (15, 16, 32, "red", "green");

我想在 vim 中执行搜索和替换以更改每行上的第三个数字(在本例中为 108(,使其增加 15。因此,生成的行将如下所示:

insert into team (lowernum, uppernum, position, color1, color2) values (15, 16, 47, "red", "green");

我已经尝试了几个搜索和替换选项,但还没有弄清楚如何将变量与子匹配组合以获得我想要的结果。我尝试过的一个例子在这里:

:%s/((dd, dd, )(dd)/=1 submatch(2) + 15/g

显然,这给出了一个错误,但我无法找出实现替换子句的正确方法。正确的方法是什么?

根据 romainl 的回答,这是对我有用的解决方案:

:%s/d{1,}, d{1,}, zs(d{1,})/=submatch(0) + 15/g

zs 表示将被替换的模式的开始。

这应该可以解决问题:

:s/d{2,}, d{2,}, zs(d{2,})/=submatch(0) + 15

做了一些研究,似乎不可能在 vim 或 sed 中实际进行搜索/替换操作的算术。虽然如果真的是,我也会很感兴趣。我得到的是,我在评论中建议的,UPDATE语句会影响整个表,而不仅仅是该文件的插入值。

所以这里有一个替代解决方案(假设你使用的是mysql(:

将该文件中出现的"team"替换为"tmp_team"。

然后添加到文件顶部:

CREATE TABLE tmp_team LIKE team;

开始编辑:现在假设团队表在列id上有一个auto_increment主键,您必须将该键放在 tmp 表中并将其所有值设置为 null:

-- getting rid of the auto_increment property:
ALTER TABLE tmp_team MODIFY id INT DEFAULT NULL;
-- dropping primary key:
ALTER TABLE tmp_team DROP PRIMARY KEY;
UPDATE tmp_team SET id = NULL;

结束编辑

并在文件底部:

UPDATE tmp_team SET position = position+15;
-- inserting NULL values into an auto_increment column, assigns
-- correct values to the new entries
INSERT INTO team SELECT * FROM tmp_team;
DROP TABLE tmp_team;

这样,您只会影响该文件中球队的位置值。

最新更新