'Alphanumeric substitution with vim

I'm using the vscode vimplugin. I have a bunch of lines that look like:

Terry,169,80,,,47,,,22,,,6,,

I want to remove all the alphanumeric characters after the first comma so I get:

Terry,,,,,,,,,,,,,

In command mode I tried:

s/^.+\,[a-zA-Z0-9-]\+//g

But this does not appear to do anything. How can I get this working?

edit:

s/^[^,]\+,[a-zA-Z0-9-]\+//g


Solution 1:[1]

\+ is greedy; ^.\+, eats the entire line up to the last ,.

Instead of the dot (which means "any character") use [^,] which means "any but a comma". Then ^[^,]\+, means "any characters up to the first comma".

The problem with your requirement is that you want to anchor at the beginning using ^ so you cannot use flag g — with the anchor any substitution will be done once. The only way I can solve the puzzle is to use expressions: match and preserve the anchored text and then use function substitute() with flag g.

I managed with the following expression:

:s/\(^[^,]\+\)\(,\+\)\(.\+\)$/\=submatch(1) . submatch(2) . substitute(submatch(3), '[^,]', '', 'g')/

Let me split it in parts. Searching:

\(^[^,]\+\) — first, match any non-commas
\(,\+\) — any number of commas
\(.\+\)$ — all chars to the end of the string 

Substituting:

\= — the substitution is an expression

See http://vimdoc.sourceforge.net/htmldoc/change.html#sub-replace-expression

submatch(1) — replace with the first match (non-commas anchored with ^)
submatch(2) — replace with the second match (commas)
substitute(submatch(3), '[^,]', '', 'g') — replace in the rest of the string

The last call to substitute() is simple, it replaces all non-commas with empty strings.

PS. Tested in real vim, not vscode.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1