Ejemplos del comando sed para manipulación de texto en Linux

Agregando e insertando líneas en archivos

Para insertar contenido después de una línea específica, se usa el comando a de sed. Por ejemplo, dado un archivo datos.txt con el contenido:

$ cat datos.txt
Redes - Administración de redes
Bases de Datos - SQL, MongoDB, etc.
Seguridad - Firewall, Cifrado, etc.
Sitios Web - Diseño y Desarrollo

Agregar una línea después de la tercera línea:

$ sed '3a\ 
> Sistemas Operativos - Linux, Unix, etc.' datos.txt
Redes - Administración de redes
Bases de Datos - SQL, MongoDB, etc.
Seguridad - Firewall, Cifrado, etc.
Sistemas Operativos - Linux, Unix, etc.
Sitios Web - Diseño y Desarrollo

Insertar una línea después de una coincidencia de patrón:

$ sed '/Bases/a\ 
Sistemas Operativos - Linux, Unix, etc.' datos.txt
Redes - Administración de redes
Bases de Datos - SQL, MongoDB, etc.
Sistemas Operativos - Linux, Unix, etc.
Seguridad - Firewall, Cifrado, etc.
Sitios Web - Diseño y Desarrollo

Agregar múltiples líneas al final del archivo:

$ sed '$a\ 
Sistemas Operativos - Linux, Unix, etc.\ 
Almacenamiento - NAS, SAN, etc.' datos.txt
Redes - Administración de redes
Bases de Datos - SQL, MongoDB, etc.
Seguridad - Firewall, Cifrado, etc.
Sitios Web - Diseño y Desarrollo
Sistemas Operativos - Linux, Unix, etc.
Almacenamiento - NAS, SAN, etc.

Insertar una línea antes de una posición específica usando i:

$ sed '3i\ 
> Sistemas Operativos - Linux, Unix, etc.' datos.txt
Redes - Administración de redes
Bases de Datos - SQL, MongoDB, etc.
Sistemas Operativos - Linux, Unix, etc.
Seguridad - Firewall, Cifrado, etc.
Sitios Web - Diseño y Desarrollo

Insertar múltiples líneas antes de una coincidencia de patrón:

$ sed '/Seguridad/i\ 
> Sistemas Operativos - Linux, Unix, etc.\ 
> Almacenamiento - NAS, SAN, etc.' datos.txt
Redes - Administración de redes
Bases de Datos - SQL, MongoDB, etc.
Sistemas Operativos - Linux, Unix, etc.
Almacenamiento - NAS, SAN, etc.
Seguridad - Firewall, Cifrado, etc.
Sitios Web - Diseño y Desarrollo

Insertar una línea antes de la última línea del archivo:

$ sed '$i\ 
> Sistemas Operativos - Linux, Unix, etc.' datos.txt
Redes - Administración de redes
Bases de Datos - SQL, MongoDB, etc.
Seguridad - Firewall, Cifrado, etc.
Sistemas Operativos - Linux, Unix, etc.
Sitios Web - Diseño y Desarrollo

Modificando líneas en archivos

El comando c permite reemplazar líneas completas. Para cambiar la primera línea:

$ sed '1c<linea modificada="">' datos.txt
<linea modificada="">
Bases de Datos - SQL, MongoDB, etc.
Seguridad - Firewall, Cifrado, etc.
Sitios Web - Diseño y Desarrollo</linea></linea>

Cambiar una línea que coincida con un patrón:

$ sed '/Sitios/c<contenido actualizado="">' datos.txt 
Redes - Administración de redes
Bases de Datos - SQL, MongoDB, etc.
Seguridad - Firewall, Cifrado, etc.
<contenido actualizado=""></contenido></contenido>

Modificar la última línea del archivo:

$ sed '$c<ultima cambiada="" linea="">' datos.txt 
Redes - Administración de redes
Bases de Datos - SQL, MongoDB, etc.
Seguridad - Firewall, Cifrado, etc.
<ultima cambiada="" linea=""></ultima></ultima>

Eliminando líneas de archivos

Usando un archivo con números de línea registros.txt:

$ cat registros.txt 
1.  Red - Conectividad
2.  Base - MySQL, PostgreSQL
3.  Seguridad - Cifrado, Autenticación
4.  Web - HTML, CSS, JavaScript

Eliminar una línea específica:

$ sed '4d' registros.txt 
1.  Red - Conectividad
2.  Base - MySQL, PostgreSQL
3.  Seguridad - Cifrado, Autenticación

Eliminar líneas en intervalos, empezando desde la primera línea cada dos líneas:

$ sed '1~2d' registros.txt 
2.  Base - MySQL, PostgreSQL
4.  Web - HTML, CSS, JavaScript

Eliminar un rango de líneas:

$ sed '3,4d' registros.txt 
1.  Red - Conectividad
2.  Base - MySQL, PostgreSQL

Eliminar líneas fuera de un rango específico:

$ sed '3,4!d' registros.txt 
3.  Seguridad - Cifrado, Autenticación
4.  Web - HTML, CSS, JavaScript

Eliminar la última línea:

$ sed '$d' registros.txt 
1.  Red - Conectividad
2.  Base - MySQL, PostgreSQL
3.  Seguridad - Cifrado, Autenticación

Eliminar líneas que coincidan con un patrón:

$ sed '/Red/d' registros.txt 
2.  Base - MySQL, PostgreSQL
3.  Seguridad - Cifrado, Autenticación
4.  Web - HTML, CSS, JavaScript

Eliminar desde una coincidencia hasta el final:

$ sed '/Seguridad/,$d' registros.txt 
1.  Red - Conectividad
2.  Base - MySQL, PostgreSQL

Eliminar una coincidencia y las siguientes n líneas:

$ sed '/Base/,+1d' registros.txt 
1.  Red - Conectividad
4.  Web - HTML, CSS, JavaScript

Eliminar líneas vacías:

$ sed '/^$/d' registros.txt 
1.  Red - Conectividad
2.  Base - MySQL, PostgreSQL
3.  Seguridad - Cifrado, Autenticación
4.  Web - HTML, CSS, JavaScript

Eliminar líneas que no coincidan con un patrón:

$ sed '/Base\|Seguridad/!d' registros.txt 
2.  Base - MySQL, PostgreSQL
3.  Seguridad - Cifrado, Autenticación

Eliminar dentro de un rango líneas que coincidan con un patrón:

$ sed '1,2{/etc\./d}' registros.txt 
1.  Red - Conectividad
3.  Seguridad - Cifrado, Autenticación
4.  Web - HTML, CSS, JavaScript

Sustituyendo contenido en archivos

Usando un archivo categorias.txt:

$ cat categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos
2.  Seguridad: Cifrado, Antivirus, Firewall, IDS
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
4.  Base: SQL, MySQL, Oracle, MongoDB
5.  Sistema: Linux, Unix, Windows
# Clase adicional

Sustituir la primera ocurrencia en una línea:

$ sed 's/Seguridad/Protección/' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos
2.  Protección: Cifrado, Antivirus, Firewall, IDS
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
4.  Base: SQL, MySQL, Oracle, MongoDB
5.  Sistema: Linux, Unix, Windows
# Clase adicional

Sustituir todas las ocurrencias en una línea:

$ sed 's/Seguridad/Protección/g' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos
2.  Protección: Cifrado, Antivirus, Firewall, IDS
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
4.  Base: SQL, MySQL, Oracle, MongoDB
5.  Sistema: Linux, Unix, Windows
# Clase adicional

Sustituir la n-ésima ocurrencia en una línea:

$ sed 's/Seguridad/Protección/3' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos
2.  Seguridad: Cifrado, Antivirus, Firewall, Protección
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
4.  Base: SQL, MySQL, Oracle, MongoDB
5.  Sistema: Linux, Unix, Windows
# Clase adicional

Escribir líneas modificadas en un archivo separado y mostrarlas:

$ sed -n 's/Base/DB/gpw salida.txt' categorias.txt 
4.  DB: SQL, MySQL, Oracle, MongoDB
$ cat salida.txt 
4.  DB: SQL, MySQL, Oracle, MongoDB

Aplicar sustitución solo en líneas que coincidan con un patrón:

$ sed '/:/s/,.*//g' categorias.txt 
1.  Red: Router
2.  Seguridad: Cifrado
3.  Servidor: Blade
4.  Base: SQL
5.  Sistema: Linux
# Clase adicional

Eliminar los últimos n caracteres de cada línea:

$ sed 's/..$//g' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocol
2.  Seguridad: Cifrado, Antivirus, Firewall, I
3.  Servidor: Blade, Miniordenador, Mainframe, H
4.  Base: SQL, MySQL, Oracle, MongoD
5.  Sistema: Linux, Unix, Windo
# Clase adicional

Eliminar líneas de comentarios (inician con #) y manejar líneas vacías:

$ sed 's/^#.*//;/^$/d' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos
2.  Seguridad: Cifrado, Antivirus, Firewall, IDS
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
4.  Base: SQL, MySQL, Oracle, MongoDB
5.  Sistema: Linux, Unix, Windows

Usar el carácter & para referenciar la coincidencia:

$ sed 's/^[0-9]\./(&)/' categorias.txt 
(1.)    Red: Router, Switch, Wireless, Protocolos
(2.)    Seguridad: Cifrado, Antivirus, Firewall, IDS
(3.)    Servidor: Blade, Miniordenador, Mainframe, HPC
(4.)    Base: SQL, MySQL, Oracle, MongoDB
(5.)    Sistema: Linux, Unix, Windows
# Clase adicional

Imprimiendo líneas de archivos

Para imprimir líneas específicas sin alterar el archivo, se usa el comando p con la opción -n. Ejemplo con categorias.txt:

Imprimir una línea específica:

$ sed -n '4p' categorias.txt 
4.  Base: SQL, MySQL, Oracle, MongoDB

Imprimir líneas en intervalos:

$ sed -n '1~2p' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
5.  Sistema: Linux, Unix, Windows

Imprimir la última línea:

$ sed -n '$p' categorias.txt 
# Clase adicional

Imprimir un rango de líneas:

$ sed -n '2,4p' categorias.txt 
2.  Seguridad: Cifrado, Antivirus, Firewall, IDS
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
4.  Base: SQL, MySQL, Oracle, MongoDB

Imprimir desde una línea hasta el final:

$ sed -n '3,$p' categorias.txt 
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
4.  Base: SQL, MySQL, Oracle, MongoDB
5.  Sistema: Linux, Unix, Windows
# Clase adicional

Imprimir líneas que coincidan con un patrón:

$ sed -n '/Red/p' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos

Imprimir desde una coincidencia hasta una línea específica:

$ sed -n '/Servidor/,4p' categorias.txt 
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
4.  Base: SQL, MySQL, Oracle, MongoDB

Imprimir desde una línea hasta una coincidencia de patrón:

$ sed -n '1,/Seguridad/p' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos
2.  Seguridad: Cifrado, Antivirus, Firewall, IDS

Imprimir desde una coincidencia hasta el final:

$ sed -n '/Base/,$p' categorias.txt 
4.  Base: SQL, MySQL, Oracle, MongoDB
5.  Sistema: Linux, Unix, Windows
# Clase adicional

Imprimir una coincidencia y las siguientes n líneas:

$ sed -n '/Red/,+1p' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos
2.  Seguridad: Cifrado, Antivirus, Firewall, IDS

Imprimir entre dos patrones:

$ sed -n '/Seguridad/,/DB/p' categorias.txt 
2.  Seguridad: Cifrado, Antivirus, Firewall, IDS
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
4.  Base: SQL, MySQL, Oracle, MongoDB

Imprimiendo números de línea

Para contar el total de líneas en un archivo:

$ sed -n '$=' categorias.txt
6

Imprimir números de línea junto con líneas que coincidan con un patrón, por ejemplo, errores en logs:

$ sed -n '/Error/{=;p}' /var/log/mensajes

Leyendo y escribiendo en archivos

Usendo dos archivos: registros.txt y categorias.txt como se definieron anteriormente.

Leer el contenido de un archivo después de cada línea de otro:

$ sed 'r registros.txt' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos
1.  Red - Conectividad
2.  Base - MySQL, PostgreSQL
3.  Seguridad - Cifrado, Autenticación
4.  Web - HTML, CSS, JavaScript
2.  Seguridad: Cifrado, Antivirus, Firewall, IDS
...

Leer un archivo después de una línea específica:

$ sed '3r registros.txt' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos
2.  Seguridad: Cifrado, Antivirus, Firewall, IDS
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
1.  Red - Conectividad
2.  Base - MySQL, PostgreSQL
3.  Seguridad - Cifrado, Autenticación
4.  Web - HTML, CSS, JavaScript
4.  Base: SQL, MySQL, Oracle, MongoDB
5.  Sistema: Linux, Unix, Windows
# Clase adicional

Leer un archivo después de una coincidencia de patrón:

$ sed '/Servidor/r registros.txt' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos
2.  Seguridad: Cifrado, Antivirus, Firewall, IDS
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
1.  Red - Conectividad
2.  Base - MySQL, PostgreSQL
3.  Seguridad - Cifrado, Autenticación
4.  Web - HTML, CSS, JavaScript
4.  Base: SQL, MySQL, Oracle, MongoDB
...

Leer un archivo al final:

$ sed '$r registros.txt' categorias.txt 
1.  Red: Router, Switch, Wireless, Protocolos
2.  Seguridad: Cifrado, Antivirus, Firewall, IDS
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
4.  Base: SQL, MySQL, Oracle, MongoDB
5.  Sistema: Linux, Unix, Windows
# Clase adicional
1.  Red - Conectividad
2.  Base - MySQL, PostgreSQL
3.  Seguridad - Cifrado, Autenticación
4.  Web - HTML, CSS, JavaScript

Escribir una línea específica a otro archivo:

$ sed -n '1w resultado.txt' categorias.txt 
$ cat resultado.txt 
1.  Red: Router, Switch, Wireless, Protocolos

Escribir múltiples líneas a otro archivo:

$ sed -n -e '1w resultado.txt' -e '$w resultado.txt' categorias.txt 
$ cat resultado.txt
1.  Red: Router, Switch, Wireless, Protocolos
# Clase adicional

Escribir líneas que coincidan con patrones a otro archivo:

$ sed -n '/Red\|Seguridad/w resultado.txt' categorias.txt 
$ cat resultado.txt
1.  Red: Router, Switch, Wireless, Protocolos
2.  Seguridad: Cifrado, Antivirus, Firewall, IDS

Escribir desde una coincidencia hasta el final a otro archivo:

$ sed -n '/Servidor/,$w resultado.txt' categorias.txt 
$ cat resultado.txt
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
4.  Base: SQL, MySQL, Oracle, MongoDB
5.  Sistema: Linux, Unix, Windows
# Clase adicional

Escribir una coincidencia y las siguientes n líneas a otro archivo:

$ sed -n '/Servidor/,+3w resultado.txt' categorias.txt 
$ cat resultado.txt
3.  Servidor: Blade, Miniordenador, Mainframe, HPC
4.  Base: SQL, MySQL, Oracle, MongoDB
5.  Sistema: Linux, Unix, Windows
# Clase adicional

Etiquetas: sed linux shell-scripting unix text-processing

Publicado el 6-13 22:34