En determinadas ocasiones deseamos reemplazar texto dentro de un archivo, por ejemplo, cambiar en Documento.txt todo lo que diga «mi familia» por «nosotros». Para lograr esto podemos usar nuestro editor de texto preferido (Kate, Gedit, SublimeText, etc) pero siempre es bueno conocer variantes, otras formas de lograr el mismo resultado 🙂
Sucede que con expresiones regulares se puede lograr esto, el comando sed es simplemente magnífico, tiene un sinfín de variantes y opciones pero… para aquellos que solo desean reemplazar texto de la forma menos compleja posible, para ellos es que traigo esta variante mucho más simple:
Siguiendo el ejemplo, tenemos el archivo Documento.txt ubicado en $HOME/Documento.txt con el siguiente texto:
(…) mi familia es como todas, como la tuya o la de tu vecino. De hecho mi familia intentamos ser personas responsables y a los ojos de la sociedad, políticamente y socialmente correctos. No obstante, en mi casa hay una oveja negra, y ese es mi papel LOL!. Yo siempre he sido el que no teme a decir lo que piensa (aunque no sea aparentemente correcto a ojos de la sociedad), aunque en realidad mi familia está harta de la
suciedadsociedad de hoy en día.
Con el siguiente comando cambiará «mi familia» por «nosotros«:
perl -pi -e "s[mi familia][nosotros]g" $HOME/Documento.txt
Así de simple 🙂
Entonces el texto sería:
(…) nosotros es como todas, como la tuya o la de tu vecino. De hecho nosotros intentamos ser personas responsables y a los ojos de la sociedad, políticamente y socialmente correctos. No obstante, en mi casa hay una oveja negra, y ese es mi papel LOL!. Yo siempre he sido el que no teme a decir lo que piensa (aunque no sea aparentemente correcto a ojos de la sociedad), aunque en realidad mi familia está harta de la
suciedadsociedad de hoy en día.
La sintaxis es:
perl -pi -e "s[lo-que-quiero-cambiar][lo-nuevo-a-poner]g" archivo-en-el-cual-reemplazar
Puede parecer un poco complejo el comando, vamos a desglosarlo un poco y explicarlo de forma un poco más simple 😉
- perl : Lo que usaremos, perl
- -pi : Pí, como π (el de valor aproximado de 3.14)
- -e : La E imagínenla de «e de ejecutar» ^-^
- Luego entre comillas » abrimos con una s y cerramos con una g : «sg» … imaginen la S de Start (iniciar) y la G de Game Over 😀
- A su vez entre la sg debemos poner dos juegos de corchetes: [ ] y [ ], quedando así: «s[ ][ ]g»
- Dentro de los primeros corchetes como dije más arriba, irá el texto que deseamos quitar y reemplazar por uno nuevo, mientras que en el segundo juego de corchetes irá el nuevo texto a poner, siguiendo el ejemplo: «s[mi familia][nosotros]g»
¿Simple no?
La explicación es en realidad mucho más extensa que lo necesario para el comando, es bastante sencillo de entender 🙂
Perl es mucho, muchísimo más que una forma para reemplazar texto, es todo un lenguaje 😉
Si desean aprender más de él instalen el paquete perl-doc y échenle un ojo a toooodo lo que permite, simplemente es un universo diferente.
Por cierto y para cerrar, suponiendo que deseen buscar todos los archivos .txt que tengan en $HOME/Documentos/ y en cada uno reemplazar «mi familia» por «nosotros», se puede unir find + perl para lograr esto:
find $HOME/Documentos/ -name *.txt -exec perl -p -i -e "s[mi familia][nosotros]g" {} \;
O bien usando un comodín:
perl -p -i -e "s[mi familia][nosotros]g" $HOME/Documentos/*.txt
El problema con esta segunda variante, es que no reemplazará en archivos que se encuentren en subcarpetas 🙂
En fin, espero que lo hayan encontrado interesante. Para mí ha sido realmente útil, ya puedo reemplazar texto directamente desde la terminal … genial! 😀
Pues creo que acá muchos conocemos el comando sed, que sirve para lo mismo, lo hace mucho mejor y es más sencillo de usar…
Gracias por tu comentario,
Solo dos detalles, ¿por qué dices que sed lo hace mejor? ¿en serio es más sencillo de usar con tantos caracteres ‘raros’?
Saludos a todos!!!. He utilizado el comando sed, y el método descrito aquí con perl es más sencillo. Gracias KZKG^Gaara!!!.
Gracias por el comantario 🙂
Bueno, al menos a mí me parece esto más simple que expresiones regulares… que con tantos caracteres ‘raros’, a los no conocedores se les puede hacer algo realmente complejo de entender y aprender.
Dice un «viejo» adagio por ahí: «Yo tenía un problema, decidí usar Expresiones Regulares… ahora tengo DOS problemas» 😉
HAHAHAHAHAHAHA!!!
Las expresiones regulares pueden salvarnos la vida en un momento determinado … eso sí, se necesita muuucho tiempo para aprender a usarlas y no morir en el intento.
Si yo hubiese conocido este comando años atrás, DIOS!! qué simple hubiera sido mi vida 😀
Claro! Bien manejadas son poderosísimas 🙂 Para manipular texto nada mejor. Pero a veces, como dices en este caso con Perl, no hay que ir tan lejos si un replace basta.
Yo habría usado Python en todo caso 😉
Pero en sed yo lo veo hasta más simple… estoy haciendo algo mal?
sed -i «s/lo-que-quiero-cambiar/lo-nuevo-a-poner/» archivo-en-el-cual-reemplazar
je je … y si deseo reemplazar «http://my.blog.com/content/» por «http://my.blog.com/uploads/files/» 😀 … ya ahí hay que poner \ con espacios y demás, y se hace complejo o no?
No es obligatorio usar / como separador. Mira con +
sed -i «s+http://my.blog.com/content/+http://my.blog.com/uploads/files/+» fichero
O_O … WTF!
Has abierto todo un universo de opciones para mí ahora .. O_O
Me encantan estos posts donde todos aprendemos algo 🙂
Esa no me la sabía tampoco.
Prefiero usar directamente vi..
Tan simple como:
:%s/nosotros/mi familia/g
% -> todo el documento
s -> buscar
g -> todas las ocurrencias
Saludos..
Gracias!
Con vi no sabía hacerlo
Agregado a favoritos!
Gracias!
Echadle un visazo si tenéis un rato al comando rpl
http://microbuffer.wordpress.com/2011/02/28/rpl-buscar-y-reemplazar-strings-en-linux-unix/
Gran entrada!, por si a alguien le interesa, lo mismo con el comando sed de Linux: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html
Y que pasa si dentro del archivo lo que quiero reemplazar tiene comillas?
Ejemplo reemplazar lo que dice texto:»1″ por texto:»2″
como sería el comando?
Hola
Quise reemplazar una cadena que tenía una @ en medio y sólo cambiaba el texto por lo antes de la arroba.
texto a cambiar: Viva el Perú
nuevo texto : Viva mi patria @percysalgado
Se muestra : Viva mi patria
Gracias por tu ayuda
«\» hay que utilizar la barra delante de los caracteres con doble uso @, #, para que así sean interpretados como texto.
Y como lo hago en windows????