[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [Bash] Detectar correo en una línea [SOLUCIONADO]



El Jueves, 16 de Febrero de 2006 18:15, Iñaki escribió:
> Hola, estoy mirando unos manuales sencillitos de sed con ejemplos y demás
> pues tengo que hacer un script que lea un correo y se quede exclusivamente
> con la dirección de correo del From limpia (sin <>, sin comillas, sin nada,
> sólo usuario@dominio.com).
>
>
> Mi script de momento hace esto:
>
> ----------------------------------------------------------------
> #!/bin/bash
>
> # Almacenamos en $linea_from toda la línea del "From: ".
> linea_from=$(formail -X "From:" < correo.txt)
>
> # $linea_from puede ser de los siguientes tipos:
> # From: "Leandro Gao" <leandrogao@dominio.com>
> # From: =?iso-8859-15?q?leandro= <leandrogao@dominio.com>
> # From: leandrogao@dominio.com
>
> from=comando_quedarse_sólo_con_campo_email   <--esto me falta
>
> # Limpiamos los signos <> que pueden aparecer en los extremos del correo:
> from=$(echo $from  | sed -e 's/[<>]//g')
> ----------------------------------------------------------------------
>
> Como veis  me falta poder quedarme sólo con el campo que tiene una arroba,
> esa es la condición. Desgraciadamente no encuentro con "sed" el modo de
> seleccionar un campo de una línea. ¿Sería más apropiado otro comando? ¿awk?
>
> Agradezco cualquier ayuda. Estoy aprendiendo un poco más de Bash (que lo
> tenía muy olvidado) ya que estos días me hace mucha falta.
>
> Gracias y un saludo a todos.




Por fin, ya funciona:

-----------------------------------------------------------------------------
#!/bin/bash


for correo in correo * ; do

    linea_from=$(formail -X "From:" < $correo) 

    for i in $linea_from ; do
            if [ $(echo $i | grep "@") ] ; then
                    from="$i"
            fi
    done 

    #Limpiamos los signos "<> que pueden aparecer en los extremos del correo:
    from=$(echo $from  | sed -e 's/["<>]//g') 

    echo $from

done
-----------------------------------------------------------------------------


Así funciona con cualquier tipo de línea "From: ", como por ejemplo:

  From: "Leandro Gao" <leandrogao@dom.com>
  From: leandrogao@dom.com
  From: Leandro Gao <leandrogao@dom.com>
  From: leandrogao@dom.com (Leandro Gao)
  ... (vamos, que funciona siempre que haya una única @).


No obstante tengo una gran intriga de cómo se haría esto más elegante con 
"sed" o "awk". Lo he estado intentando largo tiempo con "sed" pero se me hace 
muy complicado como para mirarlo de sopetón y tengo un poco de urgencia ahora 
mismo.
¿No hay alguna especie de "grep" que en vez de examinar líneas examine cada 
palabra de la línea y muestre las coincidentes?

De verdad que me quedo con la intriga, porque al final he usado "sed" para una 
tontería al final, haciendo lo demás con bucles, grep y condicionales.



-- 
y hasta aquí puedo leer...



Reply to: