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?

  • 2
    The feature is called history expansion. Looks like we use the command-history tag for that. Added. Also, I assume you're referring to the bash shell? – Mikel Feb 24 '14 at 3:06

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


  • 1
    @slm this command is replacing just the first instance for me . [subhrcho@slc04lyo pcbpel]$ echo "hat that bat" hat that bat [subhrcho@slc04lyo pcbpel]$ !!:gs/at/xx/ echo "hxx that bat" hxx that bat. What am I missing? – Geek Feb 24 '14 at 6:35
  • @Geek - what's your distro? Are you using Bash? Version? bash --version = 4.2.45(1)-release. – slm Feb 24 '14 at 6:39
  • @slm GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc. – Geek Feb 24 '14 at 6:40
  • @Geek - too old a version, doesn't offer this feature. – slm Feb 24 '14 at 6:41

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
  • Wow, this is really neat too – Mason Feb 24 '14 at 3:54

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

$ echo "dog cat dog"
$ ^dog^cat^:&
echo "cat cat cat"
cat cat cat
  • 5
    That replaces 2 occurrences, not all of them (well all in this example as there are only 2 occurrence, but not in the general case). You'd need to add as many :& as there are more occurrences to replace. – Stéphane Chazelas Apr 30 '19 at 17:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for?Browse other questions tagged or ask your own question.