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
Active
Viewed 2.9k times
127
3 Answers
139
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
-
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 06:35 -
@Geek - what's your distro? Are you using Bash? Version?
bash --version
= 4.2.45(1)-release. – slm Feb 24 '14 at 06: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 06:40
-
65
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

Mikel
- 57,299
- 15
- 134
- 153
5
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 :&

Arthur Accioly
- 153
-
7That 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 -
1
command-history
tag for that. Added. Also, I assume you're referring to thebash
shell? – Mikel Feb 24 '14 at 03:06