La consola de Linux – sustituir un texto en un fichero

En más de una ocasión nos encontraremos con la necesidad de cambiar todas las ocurrencias de una palabra o texto de un fichero por otro. Existen varios programas que nos permiten hacerlo e incluso podemos usar la herramienta de reemplazar de nuestro editor de textos favorito. Sin embargo también podemos hacerlo desde la consola usando el comando sed. Este comando permite leer un fichero, hacer modificaciones al texto y guardarlo en otro fichero (sed es mucho más versátil que eso, pero es una buena simplificación).

Por ejemplo, para sustituir los ‘;’ por tabuladores en un fichero (el tabulador es el símbolo ‘\t’) podemos usar el comando:

que cambiará los ‘;’ del fichero_origen.txt por tabuladores y guardará el resultado en el fichero fichero_destino.txt.

‘s/;/\t/g’ es lo que se llama una expresión regular, muy usadas en la edición de ficheros. Las expresiones regulares son un poco complicadas de aprender, pero una vez que las manejas con cierta soltura te preguntas cómo podías vivir sin ellas (ojo, si te lo preguntas con mucha intensidad quizá es el momento de dedicar más tiempo a tu vida social). En otro post hablaré más extensamente sobre las expresiones regulares.

Voy a completar este post con otro ejemplo; vamos a sustituir las apariciones de ‘cabeza’ por el texto ‘pie’ en un fichero:

por si quedaba alguna duda :-).

10 thoughts on “La consola de Linux – sustituir un texto en un fichero”

  1. Deberias probar los comandos antes de publicarlos en un post.

    Me estoy volviendo loco de como realizar reemplazos directamente sobre el mismo fichero sin emplear uno temporal.

    sed -e ‘s/;/t/g’ fichero_origen.txt > fichero_origen.txt

    Esto fue lo primero que se me ocurrión intentar, la consecuencia de esto es que el contenido del fichero_origen.txt es borrado.

    Espero que si a alguien se le haya ocurrido seguir tu explicación no haya probado directamente sobre un fichero importante

  2. uhm, meter el mismo comando, pero con dos modificadores en vez de uno, y guardarlo con otro nombre la salida, por supuesto.
    Es una solución a la chapuza de post que ha echo aquí el fiera (sin ofender, pero es una chapuza que puede acarrear ciertos problemas a los que lo haya probado).

    sed -e ’s/;/t/g’ fichero_origen.txt >> fichero_origen.txt

    Informaros.. y «sed» buenos.

  3. muy bien… acabas de hacer que borre un archivo por apuntar el origen al destino. La próxima vez comprueba lo que escribes, joder.

  4. Joe, que gente… no sé a quien se le ocurrirá probar éstas cosas directamente sobre ficheros importantes pero en fin… a todo el mundo le pasa una vez y de ahí aprende como se hacen las cosas, así que, ya sabéis 😉

    El comentario es para otra cosa, si lo que queréis es que el cambio se haga sobre el mismo fichero no redirijáis la salida, usad el modificador -i, el último ejemplo quedaría así:

    sed -i ‘s/cabeza/pie/g’ mi_ficherito_DE_PRUEBA

    jejeje… tened en cuenta que si lo que queréis es borrar la palabra también podéis hacer ésto:

    sed -i ‘s/cabeza//g’ mi_ficherito_DE_PRUEBA

    Ale, que os sea leve, y no probéis cosas sobre los ficheros importantes sin hacer copias antes 😉

  5. Gracias por el artículo… yo ahora lo veo bien (imagino que estará editado).
    De todas formas, qué ansiosa es la gente, a la par que desagradecida…

  6. Yo aquí lo que veo son 2 cosas:

    1) el autor del post es un «ñapas», un chapuzas, un aficionado, en cualquier caso eso tiene disculpa, porque nadie nace sabiendo (pero a veces conviene revisar lo que se escribe antes de publicarlo).

    2) los que protestan por haberse «cargao» alguno de sus ficheros son unos torpes por no probar cosas con cuidado y haciéndole caso al primero que escribe un truco en cualquier foro.

    3) si queréis información más contrastada, buscad no en uno sino en 7 foros distintos antes de tiraros de la moto, es un consejo de alguien que también lo ha podido hacer en su momento.

    Por lo demás, viva Linux XD

  7. Lo pone bien clarito:

    sed -e ‘s/;/\t/g’ fichero_origen.txt > fichero_destino.txt

    fichero_origen.txt y fichero_destino.txt son distintos.

    fichero_destino.txt no existe (por eso usamos «>» ) y si existe, lo sobreescribe. Si no sabes esto, es que no tienes ni idea de shell.

    Despues de crear fichero_destino.txt, puedes moverlo a fichero_origen.txt para modificar el fichero original.

    El que puso «fichero_origen.txt > fichero_origen.txt «, es un BOFH que ni sabe copiar y pegar, y por supuesto de shell ni idea.

    Todos los demas que aplauden esa critica, es que no lo han probado ellos primero, y ademas, o bien no saben leer, o bien no tienen ni idea de shell.

  8. Primero, muchas gracias por el aporte del modificador «-i» para hacer la sustitución directamente sobre el mismo archivo.

    Segundo, como ya han dicho, estas cosas no se prueban sobre los archivos finales. Se prueba sobre archivos temporales hasta que estemos seguros de que es lo que necesitamos. Asi que menos quejarse…

    Tercer, gracias 🙂

  9. Mierda puta me he cargado el kernel de linux por usar sed voy a colgarte de un pino y esperar a que florezcas maldito estafador del saber.(Fdo: Mr.IRONÍA)

    GRACIAS POR EL POST ya si hubieras puesto para meterle una variable al archivo editado mientras sustituyes, que me esta dando problemas , habría estado de 10 😛

Leave a Reply

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.