Bash: Replace all occurrences of a word in the last command

Almost by mistake, I figured out you could do something like:

$ cp foo.data bar1.data
$ ^bar1^bar2

And that runs the same command with bar2.data instead of bar1.data. Now, how about if I have multiple occurrences of the target word? For example:

$ cp foo.data bar.data
$ ^data^index

It only replaces the first data extension. How do I get it to replace both?


I think ^data^index is equivalent to !!:s/data/index, so it will only substitute the first word. If you want the whole line substituted, I think you'll have to use !!:gs/data/index/


You can do it by adding ^:& to the end.
^:& will replace two occurrences
^:g& will replace all

$ cp foo.data bar.data
$ ^data^index^:&
$ cp foo.index bar.index
$ cp foo.data bar.data joe.data doe.data
$ ^data^index^:g&
$ cp foo.index bar.index joe.index doe.index

sidenote: in the book 'command line kungfu'
it says that ^:& will replace all