i am try to use a comma (,) to separate the thousands in the first two numeric fields using vim command
%s/\([0-9]\)\([0-9]\)\([0-9]\)\([0-9]\);/\1,\2\3\4;/g
but in this case it gonna add comma also to 9,995 in the second line , what can i use to replace specific N < g occurrences .
input
BitstreamCyberCJK;Freeware;30275;28686;v2.0 ;beta (1998-03-17)
Y.OzFontN;Freeware;21957;7621;v13.00 sfnt rev 9995; Pen-Ji (2010-08-24)
expected output
BitstreamCyberCJK;Freeware;30,275;28,686;v2.0 ;beta (1998-03-17)
Y.OzFontN;Freeware;21,957;7,621;v13.00 sfnt rev 9995; Pen-Ji (2010-08-24)
CodePudding user response:
There is a way to repeat the last command: @:
also, you could specify the number of repeats, for example: 10@:
.
So, start from replacing only first match: %s/\([0-9]\)\([0-9]\)\([0-9]\)\([0-9]\);/\1,\2\3\4;/
Then, as we already have done one of N substitution, repeat it N-1 times.
For example, to replace the first 10 numbers, use:
%s/\([0-9]\)\([0-9]\)\([0-9]\)\([0-9]\);/\1,\2\3\4;/
9@:
CodePudding user response:
I would use a shorter and more manageable search pattern:
:%s/\(\d\)\(\d\{3}\);/\1,\2;/g
Then, I would drop the /g
flag to only substitute the first match on each line, since the goal is specifically not to substitute all matches on all lines:
:%s/\(\d\)\(\d\{3}\);/\1,\2;
Then, I would repeat the last substitution on every line:
g&
See :help \d
, :help \{
, :help :s_flags
, and :help g&
.
CodePudding user response:
Firstly I would advise you to clean up your regex:
:%s/\([0-9]\)\([0-9]\{3}\);/\1,\2;/g
Secondly the g
flag in the end makes vim replace all occurrences. Without the flag, it will just replace the first one. Since %
runs the substitution on each line, %s//g
will replace the first occurrence on every line.
Since you want to replace the first TWO occurrences you could just run it twice. However we want to be a bit elegant here. There is the :&
command to repeat the last substitution. We can even chain them together:
:%s/\([0-9]\)\([0-9]\{3}\);/\1,\2;/ | %&