Introducción
Una tarea habitual de procesamiento de texto es «buscar y reemplazar». En los procesadores de texto, esta operación es interactiva. En los entornos de línea de comandos de Linux, sed realiza la misma tarea de forma programable y no interactiva.
sed es un editor de texto no interactivo que procesa el texto línea por línea. Es especialmente útil para las tareas de sustitución, en las que debe reemplazar patrones específicos por texto nuevo. Esto resulta práctico en la automatización, porque no es necesario que una persona permanezca frente a un editor para repetir el mismo cambio.
En este laboratorio aprenderá a:
- Sustituir texto (
s): realizar operaciones básicas de búsqueda y reemplazo. - Usar la sustitución global (
g): reemplazar todas las apariciones de un patrón en una línea, no solo la primera. - Usar delimitadores personalizados: trabajar con texto que contiene barras diagonales, como las rutas de archivos, mediante delimitadores alternativos.
- Editar en el lugar con copias de seguridad: modificar archivos de forma segura mediante la creación automática de copias de respaldo.
Sustitución básica
Comience con una sustitución sencilla en una cadena. Cambiará la palabra «World» por «Linux».
El comando de sustitución de sed es s.
La sintaxis es s/Pattern/Replacement/.
Esta estructura de comando es tan habitual que muchos usuarios consideran sed una «herramienta de búsqueda y reemplazo», pero en realidad es un editor de flujos. La sustitución es simplemente uno de sus comandos de edición más utilizados.
Ejecute este comando para ver cómo funciona:
echo "Hello World" | sed 's/World/Linux/'
Cómo funciona:
echoenvía «Hello World» a la salida estándar.- La tubería
|pasa esta salida ased. sedlee el texto, busca el patrón «World», lo reemplaza por «Linux» e imprime el resultado.
Nota: Este comando no modifica permanentemente el origen original; simplemente muestra el texto modificado en la pantalla (salida estándar).
Esta diferencia es fundamental para editar de forma segura desde la línea de comandos. En el estilo Unix, las herramientas suelen mostrar primero un flujo transformado y después usted decide si desea guardarlo o redirigirlo.
Sustitución global
De forma predeterminada, sed solo reemplaza la primera coincidencia que encuentra en cada línea.
Si el texto es «apple apple» y sustituye «apple» por «orange», sed mostrará «orange apple».
Para reemplazar todas las apariciones de una línea, debe usar el indicador global (g) al final del comando de sustitución.
El detalle importante es «en cada línea». sed procesa una línea cada vez, por lo que el indicador g afecta a todas las coincidencias de la línea actual, no a todo el archivo como si fuera un único bloque de texto.
Compruebe el archivo de ejemplo quote.txt:
cat quote.txt
Salida: I love Coding. Coding is fun.
Ahora intente reemplazar «Coding» por «Programming» sin el indicador global:
sed 's/Coding/Programming/' quote.txt
Resultado: I love Programming. Coding is fun.
Observe que se omitió la segunda aparición de «Coding».
Ahora añada el indicador g:
sed 's/Coding/Programming/g' quote.txt
Resultado: I love Programming. Programming is fun.
Ahora las dos apariciones se han reemplazado correctamente.
Usar delimitadores diferentes
La sintaxis estándar de sed utiliza barras diagonales / como delimitadores: s/old/new/.
Sin embargo, si el texto que va a reemplazar contiene barras diagonales, como una ruta de archivo (/usr/local/bin), tendría que proteger cada barra con una barra inversa. Esto hace que el comando sea difícil de leer: s/\/usr\/local\/bin/\/bin/.
Por suerte, sed permite usar casi cualquier carácter como delimitador. Algunas alternativas habituales son #, : y |.
Elegir un delimitador legible es una habilidad práctica, no solo un recurso sintáctico. Cuando los patrones contienen muchos caracteres /, cambiar el delimitador hace que el comando sea más fácil de entender y reduce la posibilidad de errores.
Cree un archivo que contenga una ruta:
echo "/usr/local/bin" > path.txt
Ahora reemplace /usr/local/bin por /bin usando # como separador:
sed 's#/usr/local/bin#/bin#' path.txt
Resultado: /bin
Como usamos # como delimitador, sed trató los caracteres / de la ruta como texto normal. Así, el comando resulta mucho más claro y fácil de leer.
Editar en el lugar con una copia de seguridad
Hasta ahora, sed solo ha mostrado los cambios en la pantalla. Para modificar directamente el archivo («en el lugar»), use la opción -i.
Sin embargo, modificar archivos directamente puede ser arriesgado. Si comete un error en el patrón, podría perder datos. Lo ideal es crear una copia de seguridad del archivo original antes de modificarlo.
Puede hacerlo proporcionando una extensión a la opción -i, como en -i.bak.
Modifique quote.txt y cree automáticamente una copia de seguridad llamada quote.txt.bak.
sed -i.bak 's/fun/awesome/' quote.txt
Ahora compruebe el contenido del archivo modificado:
cat quote.txt
Resultado: I love Coding. Coding is awesome.
A continuación, verifique que la copia de seguridad existe y contiene el texto original:
ls -l quote.txt.bak
cat quote.txt.bak
Resultado: I love Coding. Coding is fun.
Esta es una práctica recomendada al aplicar ediciones por lotes a varios archivos.
Este hábito de crear copias de seguridad es importante porque las ediciones no interactivas son rápidas, pero no perdonan los errores. Cuando automatiza la sustitución de texto en varios archivos, un pequeño error en el patrón puede propagarse rápidamente. Conservar una copia del original es una medida de seguridad sencilla.
Resumen
En este laboratorio aprendió los conceptos esenciales de la sustitución de texto con sed:
- Sustitución (
s///): el comando estándar para buscar y reemplazar texto. - Indicador global (
g): reemplazar todas las apariciones de un patrón en una línea. - Delimitadores personalizados: usar caracteres como
#para trabajar de forma segura con rutas y URL que contienen/. - Copia de seguridad durante la edición en el lugar (
-i.bak): modificar archivos de forma segura y conservar el contenido original.
Estas habilidades le permiten automatizar tareas complejas de procesamiento de texto de forma eficiente y segura.



