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

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

before

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

after

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

References

  • The Definitive Guide to Bash Command Line History
  • Caret search and replace in Bash shell

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

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 :&