Linux en Español

31+ ejemplos para el comando sed de Linux en la manipulación de texto

En la publicación anterior, hablamos de las funciones de bash y cómo utilizarlas desde la línea de comandos directamente, además de ver otras cosas geniales. Hoy vamos revisaremos una herramienta muy útil para la manipulación de cadenas llamada sed o comando sed de Linux.

Sed es utilizado para trabajar con archivos de texto como archivos de registro,


archivos de configuración y otros archivos de texto.

En esta publicación vamos a enfocarnos en el comando sed de Linux el cual se utiliza para manipulación de texto, lo cual es in paso muy importante en nuestra aventura de scripting en bash.

Los sistemas Linux proporcionan algunas herramientas para el procesamiento de texto, una de esas herramientas es sed.

Vamos a discutir más de 31 ejemplos con imágenes para mostrar la salida de cada ejemplo.

 

 

Entendiendo el Comando Sed de Linux

El comando sed es un editor de texto no interactivo. El comando sed de Linux edita datos basado en las reglas que tú le proporciones, puedes utilizarlo de la siguiente forma:

$ sed options file

Además, no tienes la limitación de utilizar sed solo para manipular archivos, también puedes aplicarlo directamente al STDIN de la siguiente forma:

$ echo "Welcome to LikeGeeks page" | sed 's/page/website/'

sed de Linux

El comando sed reemplaza el primer patrón de texto con el segundo. En este caso, la cadena “website” fue reemplazada con la palabra “pagina”, de manera que el resultado será el mostrado.

El ejemplo anterior fue un ejemplo muy básico para demostrar la herramienta. Nosotros podemos utilizar el comando sed de Linux para manipular los archivos también.

Este es nuestro archivo:

sed manipular archivo

$ sed 's/test/another test/' ./myfile

Los resultados son impresos en la pantalla instantáneamente, no tienes que esperar que se procese el archive para terminar.

Si tu archivo es lo suficientemente grande, veras el resultado antes de que el procesamiento se haya terminado.

El comando sed de Linux no actualiza tus datos. Solo envía el texto modificado a STDOUT. El archivo aun estará sin modificar. Si necesitas sobrescribir el contenido existente, puedes revisar nuestras publicaciones antiguas en donde hablamos de redirecciones.

 


Utilizando Múltiples Comandos sed de Linux en la Línea de Comandos

Para ejecutar múltiples comandos sed, puedes utilizar la opción -e de la siguiente forma:

$ sed -e 's/This/That/; s/test/another test/' ./myfile

sed múltiples comandos

El comando se debe ser separado por un punto y coma sin ningún espacio.

Además, puedes utilizar comillas simples para separar comandos como se muestra a continuación:


sed comandos separados

El mismo resultado, no hay nada nuevo.

 

Leyendo Comandos Desde un Archivo

Puedes guardar tus comandos desde un archivo y utilizarlos al especificar el archivo utilizando la opción –f.


$ sed -f mycommands myfile

Leyendo comandos desde un archivo



Banderas de Substitución

Vamos a seguir el ejemplo a continuación cuidadosamente:

$ cat myfile

$ sed 's/test/another test/' myfile

Banderas de substitución sed

El resultado anterior muestra que solo la primera ocurrencia en cada línea es reemplazada. Para sustituir todas las ocurrencias de un patrón, utiliza una de las siguientes banderas de sustitución.

Las banderas se escriben de la siguiente forma:

s/pattern/replacement/flags

Existen cuatro tipos de substituciones:

  • g, reemplazar todas las ocurrencias.
  • A número, el número de ocurrencia para el texto nuevo que quieres sustituir.
  • p, imprimir el contenido original.
  • w file: significa que debe escribir los resultados a un archivo.

Puedes limitar el reemplazamiento al especificar el número de ocurrencias que deben ser reemplazados de la siguiente forma:

$ sed 's/test/another test/2' myfile

bandera del número sed

Como puedes observar, solo la segunda ocurrencia de cada línea es reemplazada.

La bandera g significa global, esto indica que es un reemplazamiento global de todas las ocurrencias:

$ sed 's/test/another test/g' myfile

sed bandera global

La bandera p imprime cada línea que contiene un patrón de coincidencia, puedes utilizar la opción –n para imprimir solo las líneas modificadas.

$ cat myfile

$ sed -n 's/test/another test/p' myfile

líneas de supresión de sed

La bandera w guarda la salida a un archive especificado:

$ sed 's/test/another test/w output' myfile

enviar salida al archivo

La salida es impresa en la pantalla, pero las líneas que coinciden con el patrón son guardadas a un archivo de salida.

 

Reemplazar Caracteres

Supongamos que quieres buscar el shell de bash y reemplazarlo con el shell csh en el archivo /etc./passwd utilizando sed, bueno, esto lo puedes hacer fácilmente:

$ sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd

¡¡Oh!! Eso se ve terrible.

Por suerte, hay otra manera de lograr eso. Puedes utilizar el símbolo de exclamación (!) como una cadena delimitadora como la siguiente:

$ sed 's!/bin/bash!/bin/csh!' /etc/passwd

Ahora es más fácil de leer.

 

Limitando el sed

El comando sed procesa tu archive entero. Sin embargo, puedes limitar el comando sed para que procese líneas en específico, existen dos maneras:

  • Un rango de líneas.
  • Un patrón que coincide con una línea en específico.

Puedes escribir un numero para eliminar a una cantidad de líneas en específico:

$ sed '2s/test/another test/' myfile

Limitando el sed

Solo dos líneas fueron modificadas.

Ahora intentemos utilizar un rango de líneas:

$ sed '2,3s/test/another test/' myfile

reemplazar rango de lineas

Además, podemos empezar desde una línea hasta el fin de archivo

$ sed '2,$s/test/another test/' myfile

reemplazar hasta el final

O puedes utilizar un patrón como el siguiente:

$ sed '/likegeeks/s/bash/csh/' /etc/passwd

coincidencia de patrón sed

¡¡Increíble!!

Puedes utilizar expresiones regulares para que este patrón sea más genérico y útil.

 


Eliminar Líneas

Para eliminar líneas, la bandera (d) es tu amiga.

La bandera elimina el texto del flujo de datos, pero no del archivo original.

$ sed '2d' myfile

sed eliminar linea

Aquí eliminamos la segunda línea solo de myfile.

¿Qué tal si eliminamos rangos de líneas?

$ sed '2,3d' myfile

eliminar múltiples lineas

Aquí eliminamos rangos de líneas, en este caso la segunda y la tercera.

Otros tipos de rangos:

$ sed '3,$d' myfile

eliminar hasta el final

Aquí podemos observar como eliminamos desde la tercera línea hasta el final del archive.

Todos estos ejemplos nunca modifican tu archivo original.

$ sed '/test 1/d' myfile

eliminar coincidencia de patrón

Ahora en este caso utilizamos un patrón para eliminar la línea si coincide con la primera línea.

Si necesitas eliminar un rango de líneas, puedes utilizar dos patrones como los siguientes:

$ sed '/second/,/fourth/d' myfile

borrar rango de lineas

Desde la segunda a la cuarta línea fueron eliminadas.

 

Insertar y Agregar texto

Puedes insertar o agregar líneas de texto utilizando las siguientes banderas:

  • La bandera (i).
  • La bandera (a).

$ echo "Another test" | sed 'i\First test '

Insertar texto

Con esto el texto pes añadido antes de la línea especificada.

$ echo "Another test" | sed 'a\First test '

adjuntar

Al contrario, con este otro comando que añade el texto después de la línea especificada.

¿Bueno, y como logramos añadir texto en el medio?

Fácil, observa este ejemplo:

$ sed '2i\This is the inserted line.' myfile

insertar línea

Y el agregar funciona de la misma forma, pero mira en donde se posiciona el texto agregado:

$ sed '2a\This is the appended line.' myfile

añadir línea

Las mismas banderas son utilizadas, pero con una localización para la inserción o el agregado.

 


Modificando Líneas

Para modificar una línea en específico, puedes utilizar la bandera (c) de la siguiente forma:

$ sed '3c\This is a modified line.' myfile

Modificando líneas

Puedes utilizar un patrón de expresiones regulares, con lo que todas las líneas que coincidan con la expresión serán modificadas.

$ sed '/This is/c Line updated.' myfile

coincidencia de patrones

 

Transformar Caracteres

La bandera de transformación (y) funciona en los caracteres de la siguiente forma:

$ sed 'y/123/567/' myfile

Transformar caracteres

La transformación es aplicada a todos los datos y no puede ser limitada a una ocurrencia en específico.

 

Imprimir los Números de Línea

Puedes imprimir los números de línea utilizando el símbolo (=) de esta manera:

$ sed '=' myfile

Línea de números

Sin embargo, al utilizar –n combinado con el signo de igualdad, el comando sed muestra los números de línea que tengan coincidencia.

$ sed -n '/test/=' myfile

ocultar líneas

 

Leer Datos desde un Archivo

Puedes utilizar la bandera (r) para leer datos desde un archivo.

Puedes definir un numero de línea o un patrón de texto para el texto que deseas leer.

$ cat newfile

$ sed '3r newfile' myfile

Leer datos desde un archivo

El contenido se inserta después de la tercera línea como se esperaba.

Y así funciona utilizando un patrón de texto:

$ sed '/test/r newfile' myfile

leer patrón de coincidencia

¿Genial cierto?

 

Ejemplos Útiles

Tenemos un archive que contiene texto con un placeholder y tenemos otro archive que contiene datos que serán llenados.

Utilizaremos las banderas (r) y (d) para hacer este trabajo.

La palabra DATA en el archive es un placeholder para contenido real el cual es almacenado en otro archive llamado data.

Vamos a reemplazarlo con el contenido actual:


reemplazar el marcador de posición

¡¡Increíble!! Como puedes ver, la localización del placeholder está llena de datos del otro archivo.

Esta es solo una pequeña introducción acerca del comando sed. En realidad, el comando sed de Linux es otro mundo en sí mismo.

La única limitación es tu imaginación.

Espero que disfrutaras de la introducción de hoy a la manipulación de cadenas utilizando el comando Sed de Linux.

Gracias.

Mokhtar Ebrahim
Estoy trabajando como administrador de sistemas Linux desde 2010. Soy responsable de mantener, proteger y solucionar problemas de servidores Linux para múltiples clientes de todo el mundo. Me encanta escribir guiones de shell y Python para automatizar mi trabajo.

14 thoughts on “31+ ejemplos para el comando sed de Linux en la manipulación de texto

    1. Puedes usar el siguiente comando
      $ sed 's/\([A-Z]\)/ \U\1/g' yourfile
      Para enviar el resultado a un archivo, puede enviarlo así:
      $ sed 's/\([A-Z]\)/ \U\1/g' yourfile > outputfile
      Gracias!

  1. como puedo eliminar un texto hasta la primera ocurrencia de otro en una linea?

    ejemplo:

    hola como estan ocurrencia bla bla bla bla

    necesito eliminar “hola como estan ” y que solo quede desde ocurrencia en adelante.

    1. Puede eliminar el texto que desee al limitar la línea o el rango de líneas que desea, tal como se menciona en la sección 6 Limitando el sed.
      Supongamos que tiene el siguiente archivo:
      hola como estan ocurrencia bla bla bla bla
      hola como estan ocurrencia bla bla bla bla
      hola como estan ocurrencia bla bla bla bla

      Si ejecuta el siguiente comando:
      $ sed '2s/hola como estan//' myfile
      El resultado será:
      hola como estan ocurrencia bla bla bla bla
      ocurrencia bla bla bla bla
      hola como estan ocurrencia bla bla bla bla

      ¡Espero que ayude!

  2. Buenas

    Me gustaría conseguir solo sacar los usuarios de una linea y creo que el comando sed me ayudaría bastante, me podrías ayudar?

    El comando inicial es este:

    mcstatus landacraft.es status

    \\// Que devuelve este texto

    version: vPaper 1.13.2 (protocol 404)
    description: “{u’text’: u’\xa7l\xa7aLandaCraft\n\xa7r\xa7fSurvival, sin tonter\xedas.’}”
    players: 4/25 [‘PulpoEnPatineta (15d0503c-09f2-4b3b-8a83-b4f9724b899a)’, ‘MrGus78 (90f8f8b9-1747-4c3d-85d2-0d8c00cc34c1)’, ‘SerdnaYanOkio (7da183b2-e514-499d-a3f2-c3f937bd5f13)’, ‘Ronam94 (4446fd41-81ea-4357-a20e-8945d6d3299d)’]

    mcstatus landacraft.es status | grep players | cut -d ” ” -f 3-

    \\// Elimino las lineas que no me interesan y empiezo desde la 3 tercera palabra y me sale lo siguente

    [‘PulpoEnPatineta (15d0503c-09f2-4b3b-8a83-b4f9724b899a)’, ‘Ronam94 (4446fd41-81ea-4357-a20e-8945d6d3299d)’, ‘SerdnaYanOkio (7da183b2-e514-499d-a3f2-c3f937bd5f13)’, ‘MrGus78 (90f8f8b9-1747-4c3d-85d2-0d8c00cc34c1)’]

    Luego me gustaría eliminar todo lo que no sea los nombres de los jugadores. Consigo esto con el siguiente comando

    mcstatus landacraft.es status | grep players | cut -d ” ” -f 3- | sed ‘s/(//g’ | sed ‘s/)//g’ | sed ‘s/\[//g’| sed ‘s/\]//g’ | sed ‘s/,//g’ | sed “s/’//g”

    SerdnaYanOkio 7da183b2-e514-499d-a3f2-c3f937bd5f13 PulpoEnPatineta 15d0503c-09f2-4b3b-8a83-b4f9724b899a Ronam94 4446fd41-81ea-4357-a20e-8945d6d3299d MrGus78 90f8f8b9-1747-4c3d-85d2-0d8c00cc34c1

    Pero no se como eliminar los números (uuid). Creo que podría indicar que eliminara todo lo que esta entre paréntesis, pero no se como solucionarlo.

    Un cordial saludo.

    1. Para eliminar UUID, que es 8-4-4-4-12, donde contienen números y caracteres Ascii [0-9a-z]
      Entonces nuestro comando será así:
      $ sed 's/[0-9a-z]\{8\}-[0-9a-z]\{4\}-[0-9a-z]\{4\}-[0-9a-z]\{4\}-[0-9a-z]\{12\}//g'
      Saludos,

  3. Hola , algun parametro que me pueda ayudar a resolver este ejercicio? gracias de antemano
    —————————————————————-
    Si la palabra introducida tiene una letra en mayuscula, que indique cual es:
    ./cambiar
    Introduzca una palabra
    hOla
    Se encontro una letra en Mayuscula y es la “O”
    ———————————————————–

    1. Este comando obtendrá la letra mayúscula y la pondrá entre paréntesis:
      $ sed 's/[[:upper:]]/(&)/g' myfile
      Para imprimir las palabras contienen solo las letras mayúsculas:
      $ sed -n 's/.*\([[:upper:]]\)/\1/p' myfile

  4. en el primer apartado “Entendiendo el comando sed”
    EN EL EJMPLO:
    $ sed ‘s/test/another test’ ./myfile
    ^—————————falta la /
    me salio un error, investigando la syntaxis, faltaba una barra “/”.

    1. Falta una barra después de la palabra “another test”
      Entonces debería ser así:
      $ sed 's/test/another test/' ./myfile

  5. Hola!!
    Muchas gracias por el post, me ha sido muy útil para configurar mi script y he tomado apuntes para futuras necesidades 😉
    Sólo me gustaría realizar una consulta: Necesito que el script me reemplace una linea de un archivo de configuración de Odoo, guardando en ese mismo archivo todo el contenido del archivo, pero con la línea reemplazada.
    Estoy cerca, pero no se cómo guardar todo el contenido en el mismo archivo, para ello he utilizado:

    sed ‘s!/odoo/odoo-server/addons,/odoo/custom/addons!’$R1′,’$R2! w odoo-server.conf’ /home/user1/odoo-server.conf
    (R1,R2–> son variables que uso anteriormente)

    Esta instrucción me guarda sólo el contenido de la línea reemplazada, eliminando las demás lineas y es necesario mantenerlas.
    Muchas gracias de antemano. Un saludo.

    1. En realidad, Linux sed no está diseñado para la edición en contexto. Se utiliza para el filtrado.
      De todos modos, puedes guardar tus modificaciones así:
      $ sed -i 's!/odoo/odoo-server/addons,/odoo/custom/addons!'$R1′,'$R2! w odoo-server.conf' /home/user1/odoo-server.conf

Deja un comentario

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