0

我有以下 SQL,我需要将一个整数附加到电子邮件地址 - 并为每条记录增加该数字。

Insert into D2PROD."FICTITIOUS_VALUES"  values (894735,'John','Doe','U',to_timestamp('07-AUG-58 06.09.58.213000000 AM','DD-MON-RR HH.MI.SS.FF AM'),'23985','563836','563836','5f4dcc3b5aa765d61d8327deb882cf99','729','1S8I','RANCHESTER','3693','280204','190783','john.doe@example.com');
Insert into D2PROD."FICTITIOUS_VALUES"  values (334045,'Jane','Doe','B',to_timestamp('24-    APR-66 11.07.41.367000000 AM','DD-MON-RR HH.MI.SS.FF     AM'),'14647','298783','298783','5f4dcc3b5aa765d61d8327deb882cf99','229','3904','GRAYSVILLE','5214','301107','280778','jane.doe@example.com');

使用以下命令类型的作品...

:let @a=1 | %s/\(\w\+\.\w\+\)@\(\w\+\.\w\{3}\)/\="\1_".(@a+setreg('a',@a+1))."@\2"/g

但结果有奇怪的控制字符:

Insert into D2PROD."FICTITIOUS_VALUES"  values (894735,'John','Doe','U',to_timestamp('07-AUG-58 06.09.58.213000000 AM','DD-MON-RR HH.MI.SS.FF AM'),'23985','563836','563836','5f4dcc3b5aa765d61d8327deb882cf99','729','1S8I','RANCHESTER','3693','280204','190783','^A_1@^B');
Insert into D2PROD."FICTITIOUS_VALUES"  values (334045,'Jane','Doe','B',to_timestamp('24-APR-66 11.07.41.367000000 AM','DD-MON-RR HH.MI.SS.FF AM'),'14647','298783','298783','5f4dcc3b5aa765d61d8327deb882cf99','229','3904','GRAYSVILLE','5214','301107','280778','^A_2@^B');

我浏览了这个 wiki 页面 - 但我似乎无法正确使用语法。 http://vim.wikia.com/wiki/Making_a_list_of_numbers

谢谢,

马特

4

2 回答 2

2

在替换中使用表达式时,您需要submatch()使用反向引用而不是\#语法。

这使你的表达:

let @a=1 | %s/\(\w\+\.\w\+\)@\(\w\+\.\w\{3}\)/\=submatch(1)."_".(@a+setreg('a',@a+1))."@".submatch(2)/g

结果是:

Insert into D2PROD."FICTITIOUS_VALUES"  values (894735,'John','Doe','U',to_timestamp('07-AUG-58 06.09.58.213000000 AM','DD-MON-RR HH.MI.SS.FF AM'),'23985','563836','563836','5f4dcc3b5aa765d61d8327deb882cf99','729','1S8I','RANCHESTER','3693','280204','190783','john.doe_1@example.com');
Insert into D2PROD."FICTITIOUS_VALUES"  values (334045,'Jane','Doe','B',to_timestamp('24-    APR-66 11.07.41.367000000 AM','DD-MON-RR HH.MI.SS.FF     AM'),'14647','298783','298783','5f4dcc3b5aa765d61d8327deb882cf99','229','3904','GRAYSVILLE','5214','301107','280778','jane.doe_2@example.com');

有关:help submatch()更多信息,请参阅。

于 2013-07-30T13:30:38.997 回答
0

我的解决方案非常相似,只需先使用\zs\ze进行搜索,以便分隔我们将使用的模式

 /\v'\zs[^'@]+\ze\@

现在我们可以输入//命令 vim 使用最后一次搜索

 :let @a=1 | %s//\=submatch(0)."_".(@a+setreg('a',@a+1))/g
于 2018-01-30T19:12:35.287 回答