Muchos usuarios de Linux y sus numerosas di­s­tri­bu­cio­nes trabajan ocasional o re­gu­la­r­me­n­te con la línea de comandos. Algunas tareas pueden rea­li­zar­se más rá­pi­da­me­n­te o de mejor manera en el terminal que en la interfaz gráfica de usuario. Para ello, sin embargo, debemos conocer los distintos comandos y su fu­n­cio­na­mie­n­to. Uno de estos comandos en Linux es ‘sed’.

El Stream EDitor (SED) es, en efecto, un editor de texto, pero no de la forma en que uno suele ima­gi­nar­se este tipo de software. En Linux, SED es un comando con el que se pueden leer y adaptar flujos de datos. Por ello, la he­rra­mie­n­ta se utiliza pri­n­ci­pa­l­me­n­te en la pro­gra­ma­ción de shell. ¿Cómo funciona?

¿Para qué se utiliza el comando SED en Linux?

El comando ‘sed’ forma parte de las he­rra­mie­n­tas básicas de toda in­s­ta­la­ción de Linux, ya que pertenece a las GNU Core Utilities (coreutils). A la he­rra­mie­n­ta SED se le denomina editor de texto no in­ter­ac­ti­vo. Esto significa que no se hace ningún cambio di­re­c­ta­me­n­te en el archivo que estás editando. En su lugar, primero se crea un archivo temporal cuyo contenido es po­s­te­rio­r­me­n­te tra­n­s­fe­ri­do al archivo de origen. El comando SED de Linux opera línea por línea. Cada línea de un archivo se lee in­di­vi­dua­l­me­n­te, se procesa y fi­na­l­me­n­te se le da salida. La función más im­po­r­ta­n­te de SED es buscar de­te­r­mi­na­das cadenas de ca­ra­c­te­res en un archivo y su­s­ti­tui­r­las por otras.

De este modo, se puede modificar ra­di­ca­l­me­n­te un archivo completo, de forma casi au­to­má­ti­ca y con un solo comando. Si integras estos comandos en un shell script, puedes si­m­pli­fi­car mucho las tareas re­pe­ti­ti­vas. Es de esta manera que se pueden gestionar, por ejemplo, las bases de datos o un código fuente extenso. En lugar de ajustar cada entrada a mano, puedes revisar todo el archivo con el comando SED de una sola pasada.

Sintaxis y función del comando SED

El comando SED funciona con órdenes y se aplica a los archivos. Tanto el propio comando como las órdenes pueden ampliarse mediante pa­rá­me­tros.

sed [parámetro(s)] 'orden(es)' [archivo(s)]

Puedes in­tro­du­cir las órdenes de manera directa dentro del comando SED o hacer que sean leídas de un archivo. En este último caso, debes in­tro­du­cir la ruta del archivo en lugar de la orden.

Pa­rá­me­tros

Al igual que estamos aco­s­tu­m­bra­dos a in­tro­du­cir pa­rá­me­tros en comandos de Linux, también se pueden in­tro­du­cir pa­rá­me­tros en el comando SED. Para el comando SED, los pa­rá­me­tros son es­pe­cia­l­me­n­te im­po­r­ta­n­tes ya que solo a través de ellos queda claro cómo debe in­te­r­pre­tar­se el comando que viene a co­n­ti­nua­ción. Existen los si­guie­n­tes pa­rá­me­tros:

Parámetro Ex­pli­ca­ción
-e Hace que utilicen uno o varios scripts SED
-f Hace que el script se extraiga de un archivo
-n Los re­su­l­ta­dos no se deben emitir
-i Crea un archivo temporal que po­s­te­rio­r­me­n­te sustituye al archivo de origen
-u No se utiliza ningún buffer de datos
-s Varios archivos se tratan por separado en lugar de ser un único largo flujo de datos
-r El comando acepta ex­pre­sio­nes regulares ampliadas

Los pa­rá­me­tros -e y -f son los más im­po­r­ta­n­tes. Indican si las ordenes están di­re­c­ta­me­n­te en el comando (entonces es un script SED) o si el comando debe dirigirse a un archivo adicional para conseguir esas órdenes. A menudo se puede pre­s­ci­n­dir de escribir el parámetro -e, ya que es el parámetro por defecto. Sin embargo, en cuanto incluyas más de una orden en el comando al mismo tiempo, es obli­ga­to­rio poner el parámetro -e.

Nota

Si utilizas el parámetro -e, debes escribir el parámetro justo antes de la primera orden. Si utilizas otros pa­rá­me­tros, es­crí­be­los también antes de la primera orden. Si incluyes otras órdenes en el mismo comando, pon el parámetro delante de ellas también.

Muy im­po­r­ta­n­te, y pro­ba­ble­me­n­te in­di­s­pe­n­sa­ble para tu trabajo, es el parámetro -n. Si no in­tro­du­ces el parámetro -n en el comando, todas y cada una de las líneas del archivo de texto que lea el comando se mostrarán en el terminal, lo cual no es muy útil, es­pe­cia­l­me­n­te con grandes bases de datos. Si in­tro­du­ces este parámetro en el comando, en el terminal solo se mostrarán las líneas que se vean afectadas por el comando.

Órdenes

Con una orden, se le indica al comando qué debe hacer con el archivo fuente, teniendo en cuenta los pa­rá­me­tros es­pe­ci­fi­ca­dos

Orden De­s­cri­p­ción
a append: añade a las líneas se­le­c­cio­na­das una o más líneas más
c change: reemplaza las líneas se­le­c­cio­na­das por un nuevo contenido
d delete: borra las líneas se­le­c­cio­na­das
g get: copia el contenido del hold space al pattern space
G Ge­t­Ne­w­li­ne: añade el contenido del hold space al pattern space
h hold: copia el contenido del pattern space al hold space
H Ho­l­d­Ne­w­Li­ne: añade el contenido del pattern space al hold space
i insert: inserta una o más líneas antes de las líneas se­le­c­cio­na­das
l listing: muestra todos los ca­ra­c­te­res no im­pri­mi­bles
n next: cambia a la siguiente orden de la línea siguiente del comando
p print: muestra las líneas se­le­c­cio­na­das
q quit: finaliza el comando SED de Linux
r read: lee las líneas se­le­c­cio­na­das de un archivo
s su­b­s­ti­tu­te: reemplaza una de­te­r­mi­na­da cadena de ca­ra­c­te­res por otra
x xchange: in­te­r­ca­m­bia el pattern space y el hold space entre sí
y yank: sustituye un de­te­r­mi­na­do carácter por otro
w write: escribe líneas en el archivo de texto
! Negation: aplica el comando a las líneas que no coinciden con la entrada.
Hecho

Los dos tipos de memoria, hold space y pattern space, tienen tareas di­fe­re­n­tes: El pattern space es una memoria a corto plazo. Contiene los datos con los que el comando está tra­ba­ja­n­do ac­tua­l­me­n­te. El hold space es una memoria más a largo plazo. Los datos ubicados allí pueden seguir siendo llamados incluso si el comando SED ya se encuentra ocupado con otra cosa.

Las órdenes también se pueden co­m­ple­me­n­tar con pa­rá­me­tros:

Parámetro De­s­cri­p­ción
= Indica el número de línea de las líneas se­le­c­cio­na­das.
p Muestra las líneas mo­di­fi­ca­das.
g Aplica la orden a todo el archivo.
Hecho

Siempre debes de poner las órdenes entre comillas simples. De esta manera, se evita que la entrada tenga que ser re­in­te­r­pre­ta­da. En principio, las comillas no son to­ta­l­me­n­te ne­ce­sa­rias, pero así evitarás muchos errores.

Ex­pre­sio­nes regulares

Para utilizar el comando SED, es im­po­r­ta­n­te entender las ex­pre­sio­nes regulares. Los signos de pu­n­tua­ción se utilizan para indicar al comando cómo actuar ante una secuencia de ca­ra­c­te­res. Por ejemplo, los corchetes y los pa­ré­n­te­sis son im­po­r­ta­n­tes:

  • [ABC]: se utilizan corchetes cuando se busca que coincida un grupo de letras, dígitos o símbolos; es decir, A o B o C.
  • (ABC): se utilizan pa­ré­n­te­sis cuando se busca un concepto fijo; es decir, ABC en este orden.

Las wildcards permiten que con las ex­pre­sio­nes regulares se busquen solo partes de términos. Puedes utilizar dos variantes di­fe­re­n­tes:

  • .: el punto sustituye exac­ta­me­n­te a un carácter
  • *: el asterisco sustituye a cualquier número de ca­ra­c­te­res

Además, las ex­pre­sio­nes regulares te ofrecen la po­si­bi­li­dad de de­te­r­mi­nar la fre­cue­n­cia en que los ca­ra­c­te­res (o co­m­bi­na­cio­nes de ellos) deben aparecer.

  • ?: el signo de in­te­rro­ga­ción indica que un término puede aparecer una o ninguna vez
  • +: el signo positivo es­pe­ci­fi­ca que el carácter aparece varias veces, pero al menos una
  • {0,n}: con un número entre corchetes, se es­pe­ci­fi­ca exac­ta­me­n­te la fre­cue­n­cia con la que puede aparecer la co­m­bi­na­ción de ca­ra­c­te­res. Si se in­tro­du­cen dos valores (separados por una coma), esto indica el número mínimo y máximo del intervalo de re­pe­ti­cio­nes pe­r­mi­ti­das

Por último, al tratarse de Linux y SED, también puedes incluir ca­ra­c­te­res lógicos que te ayuden, por ejemplo, a enlazar o encadenar consultas de búsqueda.

  • |: una pleca situada entre dos términos simboliza una al­te­r­na­ti­va entre los dos
  • ^: el acento ci­r­cu­n­fle­jo (escrito di­re­c­ta­me­n­te delante de un término) lo niega; por tanto, esta cadena de ca­ra­c­te­res no debe aparecer

Con estos ca­ra­c­te­res se modifica la entrada del comando SED, lo que permite realizar tareas complejas.

Di­re­c­cio­nes

Las entradas en el comando SED de Linux se denominan di­re­c­cio­nes. Por lo tanto, una dirección es el objetivo del comando. Se puede indicar de di­fe­re­n­tes maneras. En muchas si­tua­cio­nes se in­tro­du­cen consultas de búsqueda adornadas con ex­pre­sio­nes regulares. Pero también es posible, por ejemplo, se­le­c­cio­nar di­re­c­ta­me­n­te líneas del archivo de texto. En co­n­se­cue­n­cia, se anotan las di­re­c­cio­nes de forma diferente.

En el primer ejemplo, nos referimos a líneas concretas:

sed -n '10,50p' texto.txt

Con este código, harás que las líneas 10 a 50 aparezcan en el terminal.

Si no sabes qué líneas son las que contienen la in­fo­r­ma­ción con la que quieres trabajar, puedes buscarla en función de la dirección. Es im­po­r­ta­n­te que las ex­pre­sio­nes comiencen y terminen siempre con una barra inclinada. De este modo, separas el término de búsqueda de otra in­fo­r­ma­ción, como por ejemplo las órdenes.

sed -n 'ejemplo.[1-9]/p' texto.txt

Este código te dará todas las líneas que están eti­que­ta­das con ejemplo o ejemplos y que tengan un dígito a co­n­ti­nua­ción.

El comando SED explicado con tres ejemplos

El comando SED puede pro­po­r­cio­nar una ayuda rápida en una gran variedad de si­tua­cio­nes. Es­pe­cia­l­me­n­te cuando hay que hacer muchos cambios a la vez en grandes archivos de texto es cuando la he­rra­mie­n­ta muestra su potencial. En los tres ejemplos si­guie­n­tes, verás varias formas de utilizar el comando SED en el día a día con Linux.

Buscar en un archivo de texto

El caso más sencillo es la búsqueda de datos es­pe­cí­fi­cos en un documento. Esto es in­te­re­sa­n­te, por ejemplo, en bases de datos extensas o con un código fuente. De esta manera, puedes encontrar con rapidez un elemento que quieras leer o editar.

Su­po­n­ga­mos ahora, como ejemplo, que buscas un Cha­r­do­n­nay en tu amplia bodega. Además, también quieres mostrar la primera línea de la base de datos, donde se explican las distintas columnas. El siguiente comando te ayudará a encontrar la posición de las botellas:

sed -n -e '1p' -e '/Chardonnay/p' vino.txt

Aquí utilizas dos comandos seguidos. Ambos son in­tro­du­ci­dos por el parámetro -e. El resultado es el siguiente:

Estantería Región de cultivo Tipo de uva Cosecha
1 Pfalz Chardonnay 2001
2 Mosel Chardonnay 1983
3 Elsass Chardonnay 1981

En principio, la wildcard entre el tipo de uva y la cosecha no es im­po­r­ta­n­te en este ejemplo. Sin embargo, si la base de datos es de­fe­c­tuo­sa o se inserta una columna po­s­te­rio­r­me­n­te, la in­fo­r­ma­ción co­n­ti­nua­rá siendo correcta.

Añadir in­fo­r­ma­ción

Con Linux y el comando SED, también puedes ampliar las bases de datos. Así que, para hacer nuevas entradas, no tienes que abrir el archivo con un verdadero editor de texto, cambiarlo y guardarlo. En cambio, el cambio lo puedes hacer con una sola línea de código.

Para nuestro ejemplo, su­po­n­ga­mos que has recibido dos nuevas botellas de vino para tu colección. Como es lógico, también querrás in­tro­du­ci­r­las en la base de datos co­rre­s­po­n­die­n­te. Puedes si­m­ple­me­n­te añadir una nueva línea al final del archivo de texto con el comando SED.

sed -i -e '$a2 Mosel Dornfelder 2010' -e '$a4 Elsass Grauburgunder 2011' vino.txt

La expresión regular $ hace que el comando SED salte di­re­c­ta­me­n­te a la última línea. La orden hace que se añada una nueva línea con el contenido que a co­n­ti­nua­ción sigue. Uti­li­za­mos la pre­po­si­ción -i para modificar di­re­c­ta­me­n­te el archivo original. Otra opción que tienes es crear una nueva base de datos:

sed -e '$a2 Mosel Dornfelder 2010' -e '$a4 Elsass Grauburgunder 2011' vino.txt > vino1.txt

Ma­n­te­ni­mie­n­to de las bases de datos

Si quieres cambiar la es­tru­c­tu­ra de grandes bases de datos con muchas entradas, es casi imposible hacerlo ma­nua­l­me­n­te. Sin embargo, Linux ofrece una solución rápida con el comando SED. Hasta ahora, las columnas in­di­vi­dua­les de tu archivo están separadas por un espacio. En este ejemplo, su­po­n­ga­mos que quieres sustituir el espacio por un guion. Para ello uti­li­za­mos la orden s:

sed -i -e 's/[[:space:]]/-/g' vino.txt

La g al final del comando indica al sistema que el comando debe de aplicarse al archivo completo.

Surge un reto similar cuando se quiere insertar in­fo­r­ma­ción adicional dentro de una línea. Su­po­n­ga­mos, por ejemplo, que en el futuro también quieres anotar si ya has degustado el vino o no. Antes de añadir más vinos de­s­co­no­ci­dos a tu bodega, marca primero todos los vinos como ya catados.

sed -i -e 's/$/-si/g' vino.txt

De esta manera el marcador ha quedado insertado en todas las filas, incluida la primera fila en la que aparecen los nombres de las columnas. Para cambiar la fila con los nombres de las columnas debes hacer otra su­s­ti­tu­ción, esta vez en la primera fila.

sed -i -e '1s/si/catado/' vino.txt

Al­te­r­na­ti­vas para el comando SED

El comando SED de Linux es un comando potente con el que puedes realizar numerosas tareas de diferente índole. Sin embargo, algunas cosas solo pueden re­so­l­ve­r­se de manera engorrosa y ne­ce­si­ta­n­do algunos trucos. Para estos casos, quizás con comandos similares eres capaz de alcanzar tu objetivo de forma más rápida y fiable.

AWK

El comando AWK se ha co­n­so­li­da­do como la evolución del comando SED. Con este comando, también se trabaja con ex­pre­sio­nes regulares, pero se dispone de po­si­bi­li­da­des adi­cio­na­les pro­ve­nie­n­tes de lenguajes de pro­gra­ma­ción más complejos. Así pues, con el comando AWK podrás compilar comandos que contengan co­n­di­cio­na­les if-else y bucles while-do.

PERL

El comando PERL toma ca­ra­c­te­rí­s­ti­cas del lenguaje C al igual que AWK. Aunque con el comando PERL se pueden crear sistemas complejos, también es adecuado para tareas más pequeñas dentro del terminal o en scripts de Bash.

TR

Si quieres cambiar ca­ra­c­te­res in­di­vi­dua­les en un archivo de texto, puede resultar más fácil si usas un comando distinto al SED. TR (abre­via­tu­ra de: translate) está diseñado para sustituir letras, números o ca­ra­c­te­res es­pe­cia­les por otros. Por ejemplo, con él se pueden eliminar fá­ci­l­me­n­te los dobles espacios o ajustar las ma­yú­s­cu­las y mi­nú­s­cu­las. Mientras que estas pequeñas tareas son muy fáciles de hacer con TR, para trabajos más complejos hay que recurrir a otras so­lu­cio­nes como el comando SED.

Ir al menú principal