^x^y unix trick for all instances in last command?

One of my favorite Unix tricks is ^x^y, which will take the last command and replace the first instance of “x” with “y”. However, I’m wondering if a similar trick works to replace all instances of “x” with “y” in the last command?

Asked By: Mason


You can use the !!:gs/search/replace/ notation to do what you want. This utilizes the global search & replace (:gs):


$ echo "harm warm swarm barm"
harm warm swarm barm


$ !!:gs/arm/orn/
echo "horn worn sworn born"
horn worn sworn born


Answered By: slm

I don’t believe there’s an easy way to add something to ^string1^string2 to make bash replace every occurrence. As slm points out, you have to write !!:gs/string1/string1.

But in zsh, you can just add :G:

$ echo foo foo
foo foo
$ ^foo^bar^:G
echo bar bar
bar bar

In both bash and zsh, you can also use fc -s like this:

$ echo foo foo
foo foo
$ fc -s foo=bar
echo bar bar
bar bar

This is often made into an alias called r so you can just do:

$ echo foo foo
foo foo
$ r foo=bar
echo bar bar
bar bar
Answered By: Mikel

I believe that the best option is to use ":&"

$ echo "dog cat dog"
$ ^dog^cat^:&
echo "cat cat cat"
cat cat cat

But like St├ęphane Chazelas commented below, this replaces just 2 occurrences. If you have more, you’d need to add more :&

Answered By: Arthur Accioly