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