Comandos básicos en la terminal: sed

tip-terminalComo siempre digo, este blog está como un bloc de notas de las cosas que voy aprendiendo y los problemas que me van surgiendo con el intento de sus soluciones y esta no iba a ser menos.

Hace unos días me encontré con un problemilla con mi Arch y es que llevaba 2 días que cuando lo actualizaba me tiraba por la terminal un

… el sistema ya está actualizado.

cosa ya no bastante improbable, sino casi imposible y entonces recordé que algunas veces ha actualizado el mirrolist y lo guarda como mirrorlist.pacnew, supongo que por estar el original modificado, no lo sobreescribe y lo guarda al lado.

Podría haber pasado algún script para filtrar los mirrors de mi mirrorlist como reflector o el mismo pacman y seguramente se hubiera corregido el problema, pero ese día me dió por ir y cambiar el antiguo mirrorlist por el mirrorlist.pacnew a mano, lo hago y cuando vuelvo a actualizar, ahora no conectaba con ningun repositorio, ni core, ni extra, ni community, ni multilib, solo lo hacía con archlinuxfr, los de yaourt vamos.

Entonces abro el archivo mirrorlist a ver que pasa cuando me encuentro un archivo enorme y totalmente comentado de cabo a rabo, aquí un fragmento del archivo:

##
## Arch Linux repository mirrorlist
## Generated on 2015-05-19
##
#
## Worldwide
#Server = http://mirror.rackspace.com/archlinux/$repo/os/$arch
#
## Australia
#Server = http://mirror.aarnet.edu.au/pub/archlinux/$repo/os/$arch
#Server = http://archlinux.mirror.digitalpacific.com.au/$repo/os/$arch
#Server = http://ftp.iinet.net.au/pub/archlinux/$repo/os/$arch
#Server = http://mirror.internode.on.net/pub/archlinux/$repo/os/$arch
#Server = http://mirror.rackcentral.com.au/archlinux/$repo/os/$arch
#Server = http://ftp.swin.edu.au/archlinux/$repo/os/$arch
#Server = http://archlinux.mirror.uber.com.au/$repo/os/$arch
#
## Austria
#Server = http://mirror.easyname.at/archlinux/$repo/os/$arch
#Server = http://mirror1.htu.tugraz.at/archlinux/$repo/os/$arch

Se me pasó por la cabeza el descomentarlo a mano pero dije, apuesto a que hay un comando que hace esto por mi y como es costumbre, lo hay 😉

El comando es sed, un editor de texto un tanto peculiar, no os pondré teoría de como funciona porque sería un corta/pega adaptado de otras web’s que si entienden de lo que hablan, así que sin más nos ponemos al caso práctico que nos ocupa que es eliminar el primer # de todas las líneas.

Antes de todo os pongo un par de tablas con algunos caracteres especiales y expresiones regulares para usar sed en su uso mas básico.

Caracter                                       Descripción

^                                                             Inicio de línea

$                                                             Final de línea

.                                                              Filtra un solo caracter

*                                                             Filtra cero o más caracteres

 

Expresion Regular                    Descripción

/ ./                                                    Filtra cualquier linea que tenga al menos 1 caracter

/ …/                                                  Filtra cualquier linea que tenga al menos 3 caracteres

/^#/                                                 Filtra cualquier linea que comience por #

/^$/                                                 Filtra cualquier en blanco

/#$/                                                 Filtra cualquier linea que termine en #

 

Opcion                        Descripción

i                                                      Insertar línea antes de la linea actual

a                                                     Insertar linea después de la linea actual

c                                                     Cambiar linea actual

d                                                     Borrar linea actual

p                                                     Imprimir línea actual

s                                                     Sustituir cadena en línea actual

r “archivo”                                     Añadir el contenido de “archivo” a la línea actual

w “archivo”                                    Escribir salia a un archivo

!                                                      Aplicar instrucción a las líneas no seleccionadas

q                                                      Finalizar procesamiento del archivo

 

 

Ya con esto tenemos donde empezar y para el caso que nos ocupa que sería quitar el primer caracter de todas las líneas seria algo como esto:

 sed -e 's/^#//' archivo

Aquí básicamente lo que hemos hecho es sustituir (s) la # del comienzo (/^#) con un espacio nulo (/). Aqui lo vemos mejor

Lo podriamos haber sustituido por cualquier cosa que nos hiciera falta por poner un ejemplo una @:

sed -e 's/^#/@/' archivo

sed-3

Podriamos borrar las líneas en blanco del documento

sed -e '/^$/' d archivo

sed-4

O por ejemplo para eliminar todos los repositorios de Australia, filtrariamos desde # Australia hasta la primera línea en blanco /^$/ y eliminamos con d.

sed -e '/^# Australia/,/^$/ d' archivo

sed-5

Esto son solo algunos ejemplos básicos de las miles de cosas que hace este comando y por último deciros que tal como lo hemos estado haciendo el archivo original no se modifica, solo nos saca el resultado por la salida estandar, en este caso el monitor, para modificar el archivo, bastaria con darle salida de igual modo que se hace en otros muchos comandos:

sed comandos condiciones archivo-entrada > archivo salida

Una muestra en la que hemos eliminado el primer # de todas las líneas y he eliminado los repositorios de Worldwide y lo hemos mandado a prueba-sed-3, todo en el mismo comando:

 

sed-6 sed-7

El comando sed es inmenso, podéis ojear su página man o buscar información por la red para ampliar conocimientos y darle uso, hasta otra 🙂

2 comentarios:

  1. Cómo no podía ser de otro modo también lo hay para Debian así que lo tendré en cuenta ya que me encantan este tipo de comandos.

    Generalmente lo que suelo hacer para estas cosas es usar un editor de texto con la opción de reemplazar pero vía terminal me parece mucho más cómodo y práctico 🙂

  2. Asi es Liamngls, al principio parece un poco lioso, pero una vez comprendes las expresiones que usa, es bastante rápido y cómodo.

    Gracias por pasar 😉

Deja un comentario

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.