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

27,385

Solution 1

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

Solution 2

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

Solution 3

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

Share:
27,385

Related videos on Youtube

Mason
Author by

Mason

Updated on September 18, 2022

Comments

  • Mason
    Mason almost 2 years

    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?

    • Mikel
      Mikel over 10 years
      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?
  • Mason
    Mason over 10 years
    Wow, this is really neat too
  • jshthornton
    jshthornton over 10 years
    @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?
  • slm
    slm over 10 years
    @Geek - what's your distro? Are you using Bash? Version? bash --version = 4.2.45(1)-release.
  • jshthornton
    jshthornton over 10 years
    @slm GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc.
  • slm
    slm over 10 years
    @Geek - too old a version, doesn't offer this feature.
  • Stéphane Chazelas
    Stéphane Chazelas about 5 years
    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.
  • Lajos
    Lajos about 3 years
    What is the :& operator? :thinking: