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/

| improve this answer | |
  • This replacement (:gs/data/index) is a bash feature or is it implicitly calling another program? – JohnTortugo May 18 '15 at 0:59
  • Is a bash feature – Pablo A Feb 6 '19 at 5:31

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

| improve this answer | |
  • 1
    Actually, ^:& will do the substitution twice.  To do all occurrences, use ^:g& (g stands for "global"). – G-Man Says 'Reinstate Monica' Jul 14 '15 at 20:07
  • Tnx ! I never tested it for more than two occurrences. Read the command in a book. – Note89 Jul 16 '15 at 6:57

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.