Globally append to line with matching term in vim

:%s/green/bright &/g: Replace each "green" with "bright green" in the file.

&: substitute matched string. You can do anything you can imagine.

You can use the flag \v so we don't have to use as many escape characters.

append the parameter --no-startup-id after exec or exec_always

:%s/exec\(_always\)\?/& --no-startup-id/g

simplify it:

:%s/\vexec(_always)?/& --no-startup-id/g


The :g// command is what you're looking for — it runs a command on each line matching a pattern:

:g/Thing to find/ s/$/ Stuff to append/

As mentioned, :g// is what you're after, but one further efficiency for your particular need is to run a normal command as part of the global. s is just one of a bunch of commands that :g// can take. You could also d(elete), j(oin), and pretty much whatever ex commands you can imagine.

Another useful one is norm(al), which can be used to execute any normal command. From the :help on :norm(al): "Commands are executed like they are typed."

So you could also achieve what you want with:

:g/Thing to find/norm Astuff to append

Let's say I'm duplicating my mysql config file for my test environment. I want to append _test to every line that starts with "database=", so:

g/^database=/norm A_test

The thing to remember is that Vim will execute everything after 'norm' as if you had typed it in. So no space between the A command and the text to be appended (or you will get an extra space in the output).

Tags:

Vim