Reemplaza texto dentro de archivos con solo un comando: perl

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 suciedad sociedad 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 suciedad sociedad 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 comillasabrimos 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! 😀


20 comentarios

  1.   Boom dijo

    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…

    1.    KZKG^Gaara dijo

      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’?

  2.   Federico A. Valdés Toujague dijo

    Saludos a todos!!!. He utilizado el comando sed, y el método descrito aquí con perl es más sencillo. Gracias KZKG^Gaara!!!.

    1.    KZKG^Gaara dijo

      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.

      1.    Giskard dijo

        Dice un “viejo” adagio por ahí: “Yo tenía un problema, decidí usar Expresiones Regulares… ahora tengo DOS problemas” 😉

        1.    KZKG^Gaara dijo

          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 😀

          1.    Giskard dijo

            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 😉

    2.    dhunter dijo

      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

      1.    KZKG^Gaara dijo

        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?

        1.    dhunter dijo

          No es obligatorio usar / como separador. Mira con +

          sed -i “s+http://my.blog.com/content/+http://my.blog.com/uploads/files/+” fichero

          1.    KZKG^Gaara dijo

            O_O … WTF!
            Has abierto todo un universo de opciones para mí ahora .. O_O

          2.    Giskard dijo

            Me encantan estos posts donde todos aprendemos algo 🙂
            Esa no me la sabía tampoco.

  3.   RAW-Basic dijo

    Prefiero usar directamente vi..

    Tan simple como:
    :%s/nosotros/mi familia/g

    % -> todo el documento
    s -> buscar
    g -> todas las ocurrencias

    Saludos..

    1.    KZKG^Gaara dijo

      Gracias!
      Con vi no sabía hacerlo

  4.   st0rmt4il dijo

    Agregado a favoritos!

    Gracias!

  5.   n3storm dijo

    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/

  6.   DuranG dijo

    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

    1.    Dudando dijo

      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?

  7.   Percy Salgado dijo

    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

  8.   Anónimo dijo

    “\” hay que utilizar la barra delante de los caracteres con doble uso @, #, para que así sean interpretados como texto.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.