^ x ^ y truco unix para todas las instancias en el último comando?

97

Uno de mis trucos favoritos de Unix es ^x^y, que tomará el último comando y reemplazará la primera instancia de "x" con "y". Sin embargo, me pregunto si un truco similar funciona para reemplazar todas las instancias de "x" con "y" en el último comando.

Masón
fuente
2
La característica se llama expansión de historial. Parece que usamos la command-historyetiqueta para eso. Adicional. Además, supongo que te estás refiriendo a la bashcáscara?
Mikel

Respuestas:

107

Puedes usar la !!:gs/search/replace/notación para hacer lo que quieras. Esto utiliza la búsqueda y reemplazo global ( :gs):

antes de

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

después

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

Referencias

slm
fuente
1
@slm este comando está reemplazando solo la primera instancia para mí. [subhrcho@slc04lyo pcbpel]$ echo "hat that bat" hat that bat [subhrcho@slc04lyo pcbpel]$ !!:gs/at/xx/ echo "hxx that bat" hxx that bat. ¿Qué me estoy perdiendo?
Geek
@ Geek: ¿cuál es tu distribución? ¿Estás usando Bash? ¿Versión? bash --version= 4.2.45 (1) -lanzamiento.
slm
@slm GNU bash, versión 3.2.25 (1) -release (x86_64-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc.
Geek
@ Geek: una versión demasiado antigua, no ofrece esta función.
slm
46

No creo que hay una manera fácil de agregar algo para ^string1^string2hacer bashreemplazar todas las apariciones. Como slm señala, tienes que escribir !!:gs/string1/string1.

Pero en zsh, solo puedes agregar :G:

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

En ambos bashy zsh, también puedes usar fc -sasí:

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

Esto a menudo se convierte en un alias llamado rpara que pueda hacer lo siguiente:

$ echo foo foo
foo foo
$ r foo=bar
echo bar bar
bar bar
Mikel
fuente
Wow, esto también es genial
Mason
2

Creo que la mejor opción es usar ": &"

$ echo "dog cat dog"
$ ^dog^cat^:&
echo "cat cat cat"
cat cat cat
Arthur Accioly
fuente
3
Eso reemplaza 2 ocurrencias, no todas (bueno, en este ejemplo, ya que solo hay 2, pero no en el caso general). Debería agregar tantos :&como haya más ocurrencias para reemplazar.
Stéphane Chazelas