¿Cómo funciona el comando SED de Linux?

Muchos usuarios de Linux y sus numerosas distribuciones trabajan ocasional o regularmente con la línea de comandos. Algunas tareas pueden realizarse más rápidamente 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 funcionamiento. 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 imaginarse este tipo de software. En Linux, SED es un comando con el que se pueden leer y adaptar flujos de datos. Por ello, la herramienta se utiliza principalmente en la programación de shell. ¿Cómo funciona?

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

El comando ‘sed’ forma parte de las herramientas básicas de toda instalación de Linux, ya que pertenece a las GNU Core Utilities (coreutils). A la herramienta SED se le denomina editor de texto no interactivo. Esto significa que no se hace ningún cambio directamente en el archivo que estás editando. En su lugar, primero se crea un archivo temporal cuyo contenido es posteriormente transferido al archivo de origen. El comando SED de Linux opera línea por línea. Cada línea de un archivo se lee individualmente, se procesa y finalmente se le da salida. La función más importante de SED es buscar determinadas cadenas de caracteres en un archivo y sustituirlas por otras.

De este modo, se puede modificar radicalmente un archivo completo, de forma casi automática y con un solo comando. Si integras estos comandos en un shell script, puedes simplificar mucho las tareas repetitivas. 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 parámetros.

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

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

Parámetros

Al igual que estamos acostumbrados a introducir parámetros en comandos de Linux, también se pueden introducir parámetros en el comando SED. Para el comando SED, los parámetros son especialmente importantes ya que solo a través de ellos queda claro cómo debe interpretarse el comando que viene a continuación. Existen los siguientes parámetros:

Parámetro

Explicación

-e

Hace que utilicen uno o varios scripts SED

-f

Hace que el script se extraiga de un archivo

-n

Los resultados no se deben emitir

-i

Crea un archivo temporal que posteriormente 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 expresiones regulares ampliadas

Los parámetros -e y -f son los más importantes. Indican si las ordenes están directamente 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 prescindir 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 obligatorio 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 parámetros, escríbelos 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 importante, y probablemente indispensable para tu trabajo, es el parámetro -n. Si no introduces 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, especialmente con grandes bases de datos. Si introduces 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 parámetros especificados

Orden

Descripción

a

append: añade a las líneas seleccionadas una o más líneas más

c

change: reemplaza las líneas seleccionadas por un nuevo contenido

d

delete: borra las líneas seleccionadas

g

get: copia el contenido del hold space al pattern space

G

GetNewline: añade el contenido del hold space al pattern space

h

hold: copia el contenido del pattern space al hold space

H

HoldNewLine: añade el contenido del pattern space al hold space

i

insert: inserta una o más líneas antes de las líneas seleccionadas

l

listing: muestra todos los caracteres no imprimibles

n

next: cambia a la siguiente orden de la línea siguiente del comando

p

print: muestra las líneas seleccionadas

q

quit: finaliza el comando SED de Linux

r

read: lee las líneas seleccionadas de un archivo

s

substitute: reemplaza una determinada cadena de caracteres por otra

x

xchange: intercambia el pattern space y el hold space entre sí

y

yank: sustituye un determinado 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 diferentes: El pattern space es una memoria a corto plazo. Contiene los datos con los que el comando está trabajando actualmente. 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 complementar con parámetros:

Parámetro

Descripción

=

Indica el número de línea de las líneas seleccionadas.

p

Muestra las líneas modificadas.

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 reinterpretada. En principio, las comillas no son totalmente necesarias, pero así evitarás muchos errores.

Expresiones regulares

Para utilizar el comando SED, es importante entender las expresiones regulares. Los signos de puntuación se utilizan para indicar al comando cómo actuar ante una secuencia de caracteres. Por ejemplo, los corchetes y los paréntesis son importantes:

  • [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 paréntesis cuando se busca un concepto fijo; es decir, ABC en este orden.

Las wildcards permiten que con las expresiones regulares se busquen solo partes de términos. Puedes utilizar dos variantes diferentes:

  • .: el punto sustituye exactamente a un carácter
  • *: el asterisco sustituye a cualquier número de caracteres

Además, las expresiones regulares te ofrecen la posibilidad de determinar la frecuencia en que los caracteres (o combinaciones de ellos) deben aparecer.

  • ?: el signo de interrogación indica que un término puede aparecer una o ninguna vez
  • +: el signo positivo especifica que el carácter aparece varias veces, pero al menos una
  • {0,n}: con un número entre corchetes, se especifica exactamente la frecuencia con la que puede aparecer la combinación de caracteres. Si se introducen dos valores (separados por una coma), esto indica el número mínimo y máximo del intervalo de repeticiones permitidas

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

  • |: una pleca situada entre dos términos simboliza una alternativa entre los dos
  • ^: el acento circunflejo (escrito directamente delante de un término) lo niega; por tanto, esta cadena de caracteres no debe aparecer

Con estos caracteres se modifica la entrada del comando SED, lo que permite realizar tareas complejas.

Direcciones

Las entradas en el comando SED de Linux se denominan direcciones. Por lo tanto, una dirección es el objetivo del comando. Se puede indicar de diferentes maneras. En muchas situaciones se introducen consultas de búsqueda adornadas con expresiones regulares. Pero también es posible, por ejemplo, seleccionar directamente líneas del archivo de texto. En consecuencia, se anotan las direcciones 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 información con la que quieres trabajar, puedes buscarla en función de la dirección. Es importante que las expresiones comiencen y terminen siempre con una barra inclinada. De este modo, separas el término de búsqueda de otra informació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 etiquetadas con ejemplo o ejemplos y que tengan un dígito a continuación.

El comando SED explicado con tres ejemplos

El comando SED puede proporcionar una ayuda rápida en una gran variedad de situaciones. Especialmente cuando hay que hacer muchos cambios a la vez en grandes archivos de texto es cuando la herramienta muestra su potencial. En los tres ejemplos siguientes, 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 específicos en un documento. Esto es interesante, 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.

Supongamos ahora, como ejemplo, que buscas un Chardonnay 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 introducidos 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 importante en este ejemplo. Sin embargo, si la base de datos es defectuosa o se inserta una columna posteriormente, la información continuará siendo correcta.

Añadir informació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, supongamos que has recibido dos nuevas botellas de vino para tu colección. Como es lógico, también querrás introducirlas en la base de datos correspondiente. Puedes simplemente 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 directamente a la última línea. La orden hace que se añada una nueva línea con el contenido que a continuación sigue. Utilizamos la preposición -i para modificar directamente 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

Mantenimiento de las bases de datos

Si quieres cambiar la estructura de grandes bases de datos con muchas entradas, es casi imposible hacerlo manualmente. Sin embargo, Linux ofrece una solución rápida con el comando SED. Hasta ahora, las columnas individuales de tu archivo están separadas por un espacio. En este ejemplo, supongamos que quieres sustituir el espacio por un guion. Para ello utilizamos 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 información adicional dentro de una línea. Supongamos, 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 desconocidos 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 sustitución, esta vez en la primera fila.

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

Alternativas 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 resolverse de manera engorrosa y necesitando 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 consolidado como la evolución del comando SED. Con este comando, también se trabaja con expresiones regulares, pero se dispone de posibilidades adicionales provenientes de lenguajes de programación más complejos. Así pues, con el comando AWK podrás compilar comandos que contengan condicionales if-else y bucles while-do.

PERL

El comando PERL toma características 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 caracteres individuales en un archivo de texto, puede resultar más fácil si usas un comando distinto al SED. TR (abreviatura de: translate) está diseñado para sustituir letras, números o caracteres especiales por otros. Por ejemplo, con él se pueden eliminar fácilmente los dobles espacios o ajustar las mayúsculas y minúsculas. Mientras que estas pequeñas tareas son muy fáciles de hacer con TR, para trabajos más complejos hay que recurrir a otras soluciones como el comando SED.