Bash: remplace toutes les occurrences d'un mot dans la dernière commande

14

Presque par erreur, j'ai pensé que vous pourriez faire quelque chose comme:

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

Et cela exécute la même commande avec bar2.dataau lieu de bar1.data. Maintenant, qu'en est-il si j'ai plusieurs occurrences du mot cible? Par exemple:

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

Il ne remplace que la première dataextension. Comment l'obtenir pour remplacer les deux?

Belmin Fernandez
la source

Réponses:

22

Je pense que ^data^indexc'est équivalent à !!:s/data/index, donc il ne remplacera que le premier mot. Si vous voulez remplacer la ligne entière, je pense que vous devrez utiliser!!:gs/data/index/

steabert
la source
Ce remplacement (: gs / data / index) est une fonctionnalité bash ou appelle-t-il implicitement un autre programme?
JohnTortugo
7

Vous pouvez le faire en ajoutant ^: & à la fin.
^: & remplacera deux occurrences
^: g & remplacera toutes

$ 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: dans le livre 'kungfu en ligne de commande'
il est écrit que ^: & remplacera tous

Note89
la source
1
En fait, ^:&fera la substitution deux fois . Pour faire toutes les occurrences, utilisez ^:g&( gsignifie "global").
G-Man dit `` Réintègre Monica '' le
Tnx! Je ne l'ai jamais testé pendant plus de deux occurrences. Lisez la commande dans un livre.
Note89