Re: GREP: Dúvi da com expressão regular

"Fernando M. Roxo da Motta" <[email protected]> Wed, 19 Sep 2007 10:47:33 -0300
Newsgroups gmane.org.user-groups.linux.parana
Message-ID <[email protected]>
On Fri, Jul 13, 2007 at 03:27:25PM -0300, Marcelo Beckmann wrote:
> On 7/6/07, Matias Schweizer <matias-7pUm/SSSJFa7hsvYdc9FTl/I71DsQ//[email protected]> wrote:
> >
> >         Pessoal:
=======================8<--------------------------------------------------
> >         outra RH), na RH acontece isso:
> >
> > echo "<matias-7pUm/SSSJFa7hsvYdc9FTl/I71DsQ//[email protected]>"|grep -m 1 -o -e "[a-z0-9-_.]*@[a-z0-9-.]*[a-z0-9-]*"|tail -n 1
> > grep: Invalid range end
> 
> Parece-me que tem erro de range mesmo, veja:
> a-z0-9-.
> um intervalo de "a" a "z", outro intervalo de "0" a "9" a "." ?
> 
> Testando aqui, num fedora 7:
> 
> [beckmann@beckmann tmp]$ echo "<matias-7pUm/SSSJFa7hsvYdc9FTl/I71DsQ//[email protected]>"|grep -m 1
> -o -e "[a-z0-9-_.]*@[a-z0-9-.]*[a-z0-9-]*"|tail -n 1
> grep: Intervalo final inválida
> 
> 
> Corrigindo os intervalos (escapando alguns dos -)
> 
> [beckmann@beckmann tmp]$ echo "<matias-7pUm/SSSJFa7hsvYdc9FTl/I71DsQ//[email protected]>"|grep -m 1
> -o -e "[a-z0-9\-_\.]*@[a-z0-9\-\.]*[a-z0-9\-]*"|tail -n 1
> matias-7pUm/SSSJFa7hsvYdc9FTl/I71DsQ//[email protected]

  N verdade os "escapes" não funcionam muito bem no "[ ]", mas passar o
"-" para o fim do padrão parece fumcionar também :


echo "<matias-EQc7d3XahTW9lAl/[email protected]>"|grep -m 1 -o -e '[a-z0-9_.-]*@[a-z0-9.-]*[a-z0-9-]*'|tail -n 1

  OBS:  Eu usei (') em lugar de (") para que a shell não tente expandir os
padrões d pesuisa, o que poderia produzir alguns resultados bem
esquisitos.  ;)

  Para exemplificar o problema dos (aparentes) "escapes" no padrão interno
do "[ ]" aí vão dois exemplos usando (') em lugar de (")  :


 echo '<mat\ias-EQc7d3XahTW9lAl/[email protected]>'|grep -m 1 -o -e '[a-z0-9_.-]*@[a-z0-9.-]*[a-z0-9-]*'|tail -n 1
ias-EQc7d3XahTW9lAl/[email protected]

 echo '<mat\ias-EQc7d3XahTW9lAl/[email protected]>'|grep -m 1 -o -e '[a-z0-9_.-\]*@[a-z0-9.-]*[a-z0-9-]*'|tail -n 1
mat\ias-EQc7d3XahTW9lAl/[email protected]

  Como pode ser visto nos exemplos acima, o "\" dentro do "[ ]" se torna
apenas mais um caráter da pesquisa, em lugar de um "escape" como esperado.

(/me *acha* que "-" não é caráter válido para nomes de máquinas ou
domínios, mas estou com preguiça de verificar a RFC correspondente;))

  Hmmmm.....   Houston, acho que temos um problema, como resolver então ?

  Bem, como em qualquer área de TI, se nada funciona a gente consulta o
manual ;)  :

$ man 7 regex
REGEX(7)                                                          REGEX(7)

NAME
       regex - POSIX.2 regular expressions

DESCRIPTION
   Regular  expressions  (``RE''s),  as  defined  in  POSIX.2, come in two
========8<------- indo para onde interessa  -----------------

   To include a literal `]' in the list, make it the first character (fol-
   lowing a possible `^').  To include a literal `-', make it the first or
   last  character,  or  the second endpoint of a range.  To use a literal
   `-' as the first endpoint of a range, enclose it in `[.'  and  `.]' to
   make  it  a collating element (see below).  With the exception of these
   and some combinations using `[' (see next paragraphs), all  other spe-
   cial  characters, including `\', lose their special significance within
   a bracket expression.

========8<------- o resto no manual, vale a leitura ----------

  Ah !!!  O texto acima explica porque ao colocar o "-" no fim da relação
a pesquisa funcionou como esperado.  O parágrafo também nos ajuda a
compreender porque o "\" não funciona como um filtro, como poderia parecer
para os desavisados.   Ao colocar o "\" antes do "-" o que se fez foi
separar o "-" da faixa anterior, que era o erro reportado.   O texto acima
é bem enfático em reforçar que não se pode compartilhar extremos de faixas
de pesquisa.


  Resumo, se nada funcionar :  RTFM  ;)



  Roxo

-- 
---------------- Non luctari, ludare -------------------+ WYSIWYG Editor ?
Fernando M. Roxo da Motta <[email protected]>               |  VI !!
Except where explicitly stated I speak on my own behalf.| I see text,
      ( Usuário Linux registrado #39505 )               | I get text !