^ 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.


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


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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.