web-dev-qa-db-fra.com

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

L'un de mes trucs Unix préférés est ^x^y, qui prendra la dernière commande et remplacera la première instance de "x" par "y". Cependant, je me demande si une astuce similaire fonctionne pour remplacer toutes les instances de "x" par "y" dans la dernière commande?

102
Mason

Vous pouvez utiliser le !!:gs/search/replace/ notation pour faire ce que vous voulez. Il utilise la recherche globale et le remplacement (: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

111
slm

Je ne pense pas qu'il existe un moyen simple d'ajouter quelque chose à ^string1^string2 pour que bash remplace chaque occurrence. Comme le souligne 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 bash et zsh, vous pouvez également utiliser fc -s comme ça:

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

Ceci est souvent transformé en un alias appelé r donc vous pouvez simplement faire:

$ echo foo foo
foo foo
$ r foo=bar
echo bar bar
bar bar
50
Mikel

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

$ echo "dog cat dog"
$ ^dog^cat^:&
echo "cat cat cat"
cat cat cat
3
Arthur Accioly