^ palabra ^ reemplazo ^ en todos los partidos en Bash?
Pregunta
Para aclarar, estoy buscando una manera de realizar una búsqueda global y reemplazar el comando anterior utilizado. ^ word ^ replace ^
solo parece reemplazar la primera coincidencia.
¿Hay alguna opción de set
que me está eludiendo?
Solución
Prueba esto:
$ echo oneone
oneone
$ !!:gs/one/two/ # Repeats last command; substitutes 'one' --> 'two'.
twotwo
Otros consejos
Mezclando mi respuesta aquí con John Feminella's puedes hacer esto si quieres un alias:
$alias dothis='`history -p "!?monkey?:gs/jpg/png/"`'
$ls *.jpg
monkey.jpg
$dothis
monkey.png
El !! solo el comando anterior, mientras!? string? coincide con el comando más reciente que contiene " string " ;.
Esta solución utiliza Reemplazo de subcadena Bash:
$ SENTENCE="1 word, 2 words";echo "${SENTENCE//word/replacement}"
1 replacement, 2 replacements
Tenga en cuenta que el uso de las barras diagonales dobles denota " global " reemplazo de cadena.
Esta solución se puede ejecutar en una línea.
Aquí se explica cómo reemplazar globalmente una cadena en un archivo llamado "myfile.txt":
$ sed -i -e "s/word/replacement/g" myfile.txt
Una forma desagradable de evitar esto podría ser algo como esto:
Quiere hacer eco de BAABAA
en lugar de BLABLA
cambiando L's por A's
$ echo "BLABLA"
BLABLA
$ `echo "!!" | sed 's/L/A/g'`
$(echo "echo "BLABLA" " | sed 's/L/A/g')
BAABAA
$
Desafortunadamente, esta técnica no parece funcionar en funciones o alias.
Lo pruebo en SUSE 10.1. " ^ palabra ^ reemplazo ^ " no funciona, mientras que " ^ word ^ reemplazo " funciona bien. por ejemplo:
linux-geek:/home/Myworks # ls /etc/ld.so.conf
/etc/ld.so.conf
linux-geek:/home/Myworks # ^ls^cat
cat /etc/ld.so.conf
/usr/X11R6/lib/Xaw3d
/usr/X11R6/lib
/usr/i486-linux-libc5/lib=libc5
/usr/i386-suse-linux/lib
/usr/local/lib
/opt/kde3/lib
/opt/gnome/lib
include /etc/ld.so.conf.d/*.conf
linux-geek:/home/Myworks #