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 !