Lathack

Uso del comando sed en Linux

Uso del comando sed en Linux

Introducció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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

1 + dieciocho =

Lathack
Scroll al inicio