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?

¿Fue útil?

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 #   
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top