Uso del comando sed en Linux
Table of Contents
ToggleIntroducción
El uso del comando sed en Linux es el de editor de flujo (Stream Editor) que no modifica el contenido del archivo original sino una copia e imprime por pantalla las líneas procesadas o aquellas que han sufrido cambios (esto depende de la opción que le pasemos).
Sintaxis:
sed -n (-e comando) [-f archivo-comandos] archivo [> guardar_cambios]
Opciones:
-n : Esta opción hace que no se impriman por pantalla las líneas procesadas. Podemos imprimir solo las que han experimentado modificaciones siempre y cuando utilicemos la bandera ‘flag’ p (print) que veremos a continuación.
-e : Con esta opción indicamos que estamos pasando comandos por la línea de comandos y no a través de un archivo. Se puede omitir. Los comandos pueden ir acompañados de banderas que modifican su comportamiento.
-f archivo-comando : Podemos indicar comandos desde un archivo (1 por línea).
Comando sed:
d : Elimina las filas
p : Imprime las líneas que ha experimentado cambios.
q (quit) : Recorrer un archivo e imprimir una línea y salir.
s : sustitución.
a\ : Agregar texto
i\ : Insertar texto
c\ : Cambiar texto
r : Leer archivo
= : Muestra el número de línea donde se encontró el patrón.
Recordemos que:
p y q unidos son mas efectivo, ya que no se recorre todo el archivo. Por ejemplo:
$ sed -n ‘3{p;q}’ archivo.txt
Ejemplos:
Podemos pasar varios comandos separados por ‘;‘ :
$sed -n ‘s/antiguos/MODIFICADO/g;p;=’archivo.txt
O agrupados por ‘{}‘ cuyo uso es más habitual en archivos de comandos sed :
$sed -n ‘{ s/antiguos/MODIFICADO/g; {p; {=; }}}’ archivo.txt
Pasar varios comandos desde un script sed:
$cat script.sed
s/antiguos/MODIFICADO/g
p
=
$ sed -n -f script.sed archivo.txt
Usando el comando sed
Sustituir patron1 por patron2. Por defecto sed solo sustituirá la primera coincidencia de cada línea. Si añadimos una g final sustituirá todas las coincidencias de todas las líneas.
sed s/patrón1/patrón2/g archivo.txtx
Si queremos solo sustituir la tercera coincidencia de una linea:
sed s3/patron1/patrón2 archivo.txt
Si por el contrario queremos sustituir la primera coincidencia de patrón1 en la tercera línea:
sed 3s/patrón1/patrón2 archivo.txt
Podemos sustituir todas las coincidencias de patrón 1 que ocurran desde la línea 5 a la línea 9:
sed 5-9s/patron1/patron2/g archivo.txt
Aclaración:
Podríamos haber usado d y hubiésemos eliminado las líneas donde se hubiesen encontrado patrón 1, si ademas de la g añadimos la p (print) y la acompañamos con la opción -n de sed, hubiésemos imprimido por pantalla solo las líneas afectadas.
Indicar líneas mediante patrones en vez de número:
sed /palabra_inicio/./palabra_final/s/patrón1/patrón2/g archivo.txt
En este caso sed busca ‘palabra-inicio‘ y empezará a sustituir patrón1 por patrón2 hasta que encuentre ‘palabra_final‘. Tras leer esta última línea, sed proseguirá en búsqueda de una nueva línea que contenga ‘palabra_inicio‘ y repetirá su comportamiento sucesivamente hasta terminar el archivo.
Cabe aclarar, si a este comando le añadimos la opción -n pasará algo curioso, y es que si no se encuentra ninguna línea con ‘palabra_inicio‘ no se imprimirá nada. Por el contrario, en el caso que sí se encuentren dichas líneas, pero ninguna con ‘palabra_final‘ , se imprimirán todas. Esto es por el flujo de texto que sigue sed en su búffer, es decir, el comando «sabe» lo que ha encontrado, pero no lo que encontrará.
Patrones más usados:
Si vamos a hacer uso del comando sed en linux podemos usar la bandera w para guardar las líneas modificadas en un archivo. Por ejemplo:
s/patrón1/patrón2/w archivo_salida
Añade la palabra Mundo a la línea 4 de archivo.txt después de la línea o patrón especificado:
$ sed ‘/2/ a\ Mundo’ archivo.txt
Recordar: Si empleamos la dirección /2/, sed añadirá el texto cada 2 líneas. Ahora bien, si usamos 2 a secas, solo lo añadirá una vez en la tercera línea. Pasa lo mismo con i\ y c\
Añade la palabra Mundo a la línea 5 del archivo.txt antes de la línea especificada:
$ sed ‘/6/ i\ Mundo’ archivo.txt
Esta línea va a sustituir a la línea que contiene a ‘Antigua‘ en archivo.txt
$ sed ‘/Antigua/ c\’ archivo.txt
Agrega al final de cada archivo coincidente con ‘file*.txt‘ el contenido de example.txt
$ sed -s ‘$ r example.txt’ file*.txt
Mostrar el número de línea donde se encontró patrón
$ sed -n ‘/patron/=’ archivo.txt
Otros ejemplos para limitar líneas:
Eliminar las líneas 3,4,5 y 6 del archivo example.txt
$sed ‘3,6d’ example.txt
Genera cambios de la línea 21 a la última del archivo.
$sed ’21,$s/patrón1/patrón2/g archivo.txt
Indicar que aquellas líneas que comiencen con ‘#‘ no las muestre
$sed ‘/^#/d’ /ruta/mi/archivo.txt
Negar una dirección o patrones, no imprimir las líneas 2,3 y 4:
$sed -n ‘2,4 !p’ archivo.txt
No imprimirá la línea que contenga el patrón.
$sed -n ‘/patron/! p’ archivo.txt