Servicios Vensign
13
Nov
2009

Como utilizar el comando sed en la vida real ejemplos y tips – Parte 1

  • Sigue a Vensign en Twitter
  • Digg Esto!
  • Compartelo en Facebook
  • Compartelo en Buzz
Visto 2.344 veces | 13 Comentarios | Imprimir Imprimir


titulo tutorial sed


Nivel : Principiante

En esta serie de 3 partes vamos a presentar el comando sed, uno de los comandos más poderosos en Linux para manipular texto y una herramienta muy valiosa para aquellos que administran sistemas Linux.


Bienvenido SED

Normalmente un administrador de sistemas tiene que modificar archivos de configuración, tablas y otros archivos de texto repetidamente para realizar cambios y ajustes. Linux trae una gran cantidad de editores de texto tanto para la línea de comandos (emacs, vim, nano, etc) como gráfico (gedit, kate, etc), este tipo de editores son útiles cuando vamos a editar un par de textos. Pero que pasa cuando queremos modificar una gran cantidad de archivos o queremos automatizar modificaciones a través de un script, en este caso es que entra el comando sed.

La versión GNU de sed viene incluida por defecto en la gran mayoría (sino en todas) las distribuciones de GNU/Linux.

En la definición de la Free Software Fundation acerca de sed:

Sed (streams editor) no es realmente un verdadero editor o procesador de texto. En cambio es utilizado para filtrar texto, por ejemplo, toma la entrada de texto y realiza sobre ella alguna operación (o conjunto de operaciones)  y imprime el texto modificado. Sed es usado típicamente para extraer parte de un archivo usando un patron o sustituyendo múltiples ocurrencias de una cadena de texto dentro de un archivo.

Al momento de escribir este tutorial la última versión estable de GNU sed (sed de ahora en adelante) es la 4.2.1. Para ver la versión que tienes ejecuta en el terminal:

sed --version

Lo Básico de Sed

El formato básico del comando sed es:

sed opciones [script] [archivo(s)]

Características principales de sed:

  • Si no se le da ningún archivo sed toma la entrada estandar (stdin).
  • Sed filtra línea por línea, no letra por letra.
  • La salida por defecto de sed es la salida estándar (stdout).

Para los ejemplos vamos a trabajar con el siguiente texto es una cita de Carl Sagan creen un archivo llamado texto1 con el siguiente contenido

Vivimos en una sociedad profundamente

dependiente de la ciencia y la tecnología y

en la que nadie sabe nada de estos temas.

Ello constituye una fórmula segura para el desastre.

Noten que el texto tiene líneas en blanco entre cada línea de texto, no las borren ya nos encargaremos de ellas.

Las acciones principales de sed son las siguientes:

Borrar línea o conjunto de líneas

Ejecuten el siguiente comando:

sed -e '1d' texto1

Deben ver en el terminal el texto sin la primera línea, vamos a analizar un poco el comando, le dimos la opción -e que es para editar, luego colocamos   '1d' que le dice a sed que tome la primera ocurrencia de línea y la borre (d=delete) y luego le pasamos el nombre del archivo texto1.  Noten que sed no modifica el archivo original como tal, simplemente nos muestra la modificación en la salida estándar (stdout), si queremos guardar la modificación en un nuevo archivo debemos redireccionar la salida lo cual lo veremos más adelante.

Ahora que pasa si queremos borrar más de una línea, pues afortunadamente sed permite que le demos rangos, si queremos borrar de la línea 2 a la línea 5 ejecutamos:

sed -e '2,5d' texto1

Este comando es muy parecido al anterior solo que en esta oportunidad le estamos dando un rango de la línea 2 a la línea 5. Noten que sed toma en cuenta las líneas en blanco también.

Utilizar Expresiones Regulares

Como casi todos los comandos en Linux sed también soporta expresiones regulares las cuales son muy útiles para filtrar patrones, al utilizar estas expresiones regulares es que podemos utilizar sed a su máximo potencial.

Vamos a ver un ejemplo y después entramos en detalle. Supongamos que queremos eliminar todas las líneas en blanco de nuestro archivo de texto1 utilizaríamos el siguiente comando:

sed -e '/^$/d' texto1

Lo único que hemos cambiado en el comando es la expresión regular /^$/ esta expresión quiere decir todas las líneas que estén en blanco. Muy útil cuando queremos ver un archivo que tiene muchas líneas en blanco y queremos compactar todo para verlo mejor.

Otro comando útil es para eliminar los comentarios que comienzan normalmente con # en los archivos de configuración para eliminarlos ejecutamos:

sed -e '/^#/d' /etc/services | less

Esto elimina todas las líneas que comienzan con #. No se preocupen por modificar el archivo como les dije anteriormente sed imprime el resultado en la salida estándar (stdout) y no en el archivo.

Vamos a dar un pequeño repaso de expresiones regulares.

Las expresiones regulares son un grupo de caractéres y reglas que sirven para filtrar patrones de letras, números, símbolos y condiciones como por ejemplo al principio de la línea o al fina, un caracter o varios, etc.

Caracteres especiales:

Caracter Descripción
^ Corresponde al inicio de la línea
$ Corresponde al final de la línea
. Filtra un sólo caracter
* Filtra cero o más caracteres
[] Filtra todo el rango dentro de los []

Para entender un poco mejor vamos a ver unos ejemplos todos estos los pueden colocar dentro de las ' ' en el comando sed para filtrar según sea el caso:

Expresión Regular Descripción
/./ Filtra cualquier línea que tenga al menos 1 caracter
/.../ Filtra cualquier línea que tenga al menos 3 caracter
/^#/ Filtra cualquier línea que comience con #
/^$/ Filtra cualquier línea en blanco
/)$/ Filtra cualquier línea que termine con ')' (sin espacios)
/) *$/ Filtra cualquier línea que termine con ')' seguido por cero o más espacios
/[xyz]/ Filtra cualquier linea que contenga las letras 'x' 'y' o 'z' en minúsculas
/^[DEF]/ Filtra cualquier línea que comience con 'D', 'E' o 'F'


Imprimir línea o conjuntos de líneas

Hasta ahora solo hemos borrado líneas pero que tal si queremos que imprima las líneas que coinciden con nuestro filtro. Vamos a ver un ejemplo supongamos que queremos imprimir las líneas que comienzan con d y e minúsculas entonces ejecutamos lo siguiente:

sed -n -e '/^[de]/p' texto1

Tenemos dos elementos nuevos en nuestro comando, el primero es la opción -n que hace que sólo se imprima lo que coincida con nuestro filtro y hemos cambiado el comando 'd' por el comando 'p' (print) que dice que imprima el espacio del patrón.

Si ejecutan el comando anterior deberían obtener sólo dos líneas.

Más de Expresiones Regulares

Ahora vamos a hacer algo más complejo vamos a mezclar dos expresiones regulares, supongamos que de nuestro archivo texto1 queremos imprimir desde la línea que comienza con Vivimos hasta la línea que finaliza con tecnología. para esto ejecutamos:

sed -n -e '/Vivimos/,/tecnología/p' texto1

Cuando se utiliza de esta forma sed filtrará cualquier línea que comience con la primera expresión, en este caso 'Vivimos', hasta que consiga la siguiente expresión, en este caso 'tecnología', esto nos permite imprimir bloques de texto delimitados por ciertas palabras o expresiones.

Por último si para cualquiera de los comandos anteriores queremos guardar el resultado en un nuevo archivo en vez de que sólo lo imprima en pantalla debemos redireccionar la salida (>) hacia el nuevo archivo por ejemplo:

sed -n -e '/Vivimos/,/tecnología/p' texto1 > texto2

Lo que acabamos de ver es lo básico de sed aún queda mucho más por descubrir y lo veremos en la parte 2 y 3 de esta serie.

Cualquier duda o sugerencias por favor dejen su comentario

Saludos

Olivers De Abreu

Director Vensign

Otros artículos que te pueden interesar

  1. Como configurar un Host Virtual en Apache basado en Nombre En este tutorial vamos a ver como configurar un Host...
  2. Como redireccionar el trafico a una nueva IP con IPtables Muchas veces nos pasa que cuando migramos un servidor o...
  3. Como utilizar las fuentes de Google en tu Diseño Web Recientemente Google a liberado un grupo de fuentes (o letras)...
  4. Como cambiar y recuperar la clave en un servidor MySQL En este mini tutorial les voy a explicar como pueden...
  5. Como instalar un Servidor DHCP en Ubuntu   Un servidor DHCP asigna dinámicamente direcciones IP a las...

Creative Commons License
Este trabajo está licenciado bajo Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License

Comparte este Artículo!

  • Sigue a Vensign en Twitter
  • Digg Esto!
  • Compartelo en Facebook
  • Compartelo en Buzz

Suscribirse sin comentar

13 Comentarios

  1. Hola,
    Tengo el siguiente texto:

    aaa ccc ddd fff ggg
    bbb ccc ddd fff ggg
    aaa ddd fff ccc ggg

    como hago para que me muestre el texto de la siguiente manera:

    aaa ccc
    bbb ccc
    aaa ccc

  2. rafaeltaveras says:

    saludos, señores tengo un script y no lo corro porque no se que significa , asi que si pueden ayudenme por favor.
    ((((el fin de este es cambiar la mac addres a un router que opera con un sistma basado en linux , y lo admite))))

    echo “sed -i -e ‘s#/sbin/wlanconfig \”ath0\”
    create#ifconfig wifi0 hw ether XX:XX:XX:XX:XX:XX;
    /sbin/wlanconfig \”ath0\” create#’ /etc/sysinit/radio.conf” > /etc/persistent/rc.prestart
    cfgmtd -w -p /etc/
    reboot

    la parte que quiero saber que significa es : sed -i -e

    gracias.

  3. AbiRockdriguez says:

    Hola Laura… mira ya lo tengo eso que querias hacer con tu texto de aaa,… blah blah blah jajaj…. lo unico que tienes que hacer es ir reduciendo por parte cada linea o cambiando cadenas de caracteres por un valor nulo.

    El codigo queda asi:

    sed “s/ddd//g” textoprueba.txt | sed “s/fff//g” | sed “s/\ggg//g” | sed “s/\ /\ /g”

    Lo que hacemos es que en el primer sed.. cambiamos la cadena ddd por un valor nulo.
    En la siguiente cadena sed hacemos lo mismo con f despues con g y al final cambiamos los 3 espacios por uno solo, cuando busque al final del archivo la cadena que tiene 3 espacios, al localizarla la cambiara por una que sea de 1 solo espacio…

    Espero aun te sirva esta informacion.. y que hayas solucionado tu problema. aunque aun existen muchas formas para llegar a la solucion pero siento que esta es la más facil de interpretar. Nos vemos y que estes bien..

  4. Sonia says:

    Tengo una Lista de nombres.
    Como hago para Eliminar todas las lineas, menos los que a contengan un apellido en concreto.

    Ejemplo

    Pablo Diaz xxx
    Elena Lopez xxx
    Sandra Bold xxx
    Manuel Carrasco xxx
    Elena Diaz xxx
    Paco Nuñez xxx
    Picolo Diaz xxx

    Quiero Eliminar todos los que no Tengan apellido Diaz

  5. Hola Sonia sería así:

    sed ‘/Diaz/!d’ nombres.txt

    Siendo nombre.txt el archivo donde tienes la lista de nombres. Recuerda que sed no modifica y tendrías que guardarlo en otro archivo de la siguiente forma:

    sed ‘/Diaz/!d’ nombres.txt >> solodiaz.txt

    Espero que te sirva

    Saludos
    Olivers

  6. Sonia says:

    Eres un Genio Olivers

    Muchas Gracias, ha sido rápido, muy útil sencillo, y exacto.

    Yo tenia Grandes lineas. Muchas Gracias por su respuesta.
    Sera de utilidad para mas persona.

    Visto el blog, lo completo y profesional
    os recomendare a todos mis conocidos.
    un saludo.

  7. Jesus says:

    Yo tambien Tengo una Lista de nombres.
    Como hago para Eliminar todas las lineas, menos los que a contengan un apellido en concreto.
    Ejemplo
    Pablo Diaz xxx
    Elena Lopez xxx
    Sandra Bold xxx
    Manuel Carrasco xxx
    Elena Diaz xxx
    Paco Nuñez xxx
    Picolo Diaz xxx
    Quiero Eliminar todos los que no Tengan apellido Diaz y lopez

  8. Hola Jesus si lees dos comentarios más arriba, está la respuesta a esa misma duda que planteo Sonia

    Saludos

    • Jesus says:

      Si pero ella solo esta dejando un solo apellido y yo quiero Diaz y lopez
      Son dos como pongo las dos opciones juntas?
      Gracias.

    • Jesus says:

      Quiero borrar una columna en blanco tengo este archivo
      904243381 CM10 12.04.2010 OBSERVACION DE TAREAS
      SEGURIDA CIVIL ABIE DMNV EDET KKMP PREC 904243382 CM10 12.04.2010 EQUIPO DE PROTECCION PER
      SONAL SEGURIDA CIVIL ABIE DMNV EDET KKMP PREC
      Quiero borrar el espacio que existe ente 904243380 CM10, este archivo lo estoy preparando para subirlo a una tabla, me esta causando error por que me pone una Columna de mas.
      Gracias Olivers….

  9. Sandra says:

    Si tengo la siguiente lista:

    abcd00001 ddddd 72869 ffffff
    efgh00002 ddddd 72870 ffffff
    ijkl00003 ddddd 72871 ffffff
    mnop00004 ddddd 72872 ffffff

    Cómo podría hacer para que los valores de las columnas 19 a 23 (inclusive) se copien al inicio de cada línea? Este sería el resultado que espero:

    72869abcd00001 ddddd 72869 ffffff
    72870efgh00002 ddddd 72870 ffffff
    72871ijkl00003 ddddd 72871 ffffff
    72872mnop00004 ddddd 72872 ffffff

    Espero que me puedan ayudar. Gracias.

  10. Harold Huarsaya says:

    Holas,
    tengo el siguiente texto, disperso por todo el archivo similar a:

    xxxxxxxxx, to_date(’04-03-2005 21:50:03′, ‘dd-mm-yyyy hh24:mi:ss’), yyyyyyyyyy
    xxxxxxxxx, to_date(’09-03-2008 21:50:04′, ‘dd-mm-yyyy hh24:mi:ss’), yyyyyyyyyy
    xxxxxxxxx, to_date(’05-03-2008 21:50:29′, ‘dd-mm-yyyy hh24:mi:ss’), yyyyyyyyyy

    Pero no esta ordenado en lineas como lo estoy mostrando ok, y me debe quedar

    xxxxxxxxx,(’04-03-2005 21:50:03′), yyyyyyyyyy
    xxxxxxxxx,(’09-03-2008 21:50:04′), yyyyyyyyyy
    xxxxxxxxx,(’05-03-2008 21:50:29′), yyyyyyyyyy

    Aún no encuntro la forma de representar los caracteres especiales y el espacio.

  11. rigper says:

    deseo eliminar todos las lineas que contengan este dato:
    “Local/017@from-internal/n”
    como puedo hacer la sentencia con el comando sed ??
    gracias

Deja tu comentario, duda o sugerencia

Agrega tu comentario, o trackback desde tu sitio web. Tambien puedes Registrarte o ingresar en Vensign para obtener mucho más (volveras a esta página luego de registrarte)

Puedes utilizar el siguiente código HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Este blog soporta Gravatares. Para obtener tu avatar, por favor registrate en Gravatar.

45 queries. 0,457 seconds.