^ x ^ y Un truc unix pour toutes les instances de la dernière commande?

97

Une de mes astuces Unix préférées est de ^x^yprendre la dernière commande et de remplacer la première instance de "x" par "y". Cependant, je me demande si une astuce similaire fonctionne pour remplacer toutes les occurrences de "x" par "y" dans la dernière commande?

le maçon
la source
2
La fonctionnalité est appelée expansion de l'historique. On dirait que nous utilisons la command-historybalise pour cela. Ajoutée. Aussi, je suppose que vous faites allusion à la bashcoquille?
Mikel

Réponses:

107

Vous pouvez utiliser la !!:gs/search/replace/notation pour faire ce que vous voulez. Ceci utilise la recherche globale et remplacer ( :gs):

avant

$ echo "harm warm swarm barm"
harm warm swarm barm

après

$ !!:gs/arm/orn/
echo "horn worn sworn born"
horn worn sworn born

Références

slm
la source
1
@slm cette commande remplace juste la première instance pour moi. [subhrcho@slc04lyo pcbpel]$ echo "hat that bat" hat that bat [subhrcho@slc04lyo pcbpel]$ !!:gs/at/xx/ echo "hxx that bat" hxx that bat. Qu'est-ce que je rate?
Geek
@ Geek - quelle est votre distribution? Utilisez-vous Bash? Version? bash --version= Libération de 4.2.45 (1).
slm
@slm GNU bash, version 3.2.25 (1) - release (x86_64-redhat-linux-gnu) droit d'auteur (C) 2005 Fondation pour le logiciel libre, Inc.
Geek,
@ Geek - une version trop ancienne, n'offre pas cette fonctionnalité.
slm
46

Je ne crois pas qu'il existe un moyen facile d'ajouter quelque chose ^string1^string2à faire pour bashremplacer chaque occurrence. Comme le fait remarquer le slm, vous devez écrire !!:gs/string1/string1.

Mais dans zsh, vous pouvez simplement ajouter :G:

$ echo foo foo
foo foo
$ ^foo^bar^:G
echo bar bar
bar bar

Dans les deux cas bashet zsh, vous pouvez également utiliser fc -scomme ceci:

$ echo foo foo
foo foo
$ fc -s foo=bar
echo bar bar
bar bar

Cela est souvent transformé en un alias appelé rafin que vous puissiez simplement faire:

$ echo foo foo
foo foo
$ r foo=bar
echo bar bar
bar bar
Mikel
la source
Wow, c'est vraiment très bien aussi
Mason
2

Je crois que la meilleure option est d'utiliser ": &"

$ echo "dog cat dog"
$ ^dog^cat^:&
echo "cat cat cat"
cat cat cat
Arthur Accioly
la source
3
Cela remplace 2 occurrences, pas toutes (enfin, toutes dans cet exemple car il n'y en a que 2, mais pas dans le cas général). Vous devez en ajouter autant :&qu'il y a de plus en plus d'occurrences à remplacer.
Stéphane Chazelas