shell-script-pt
[Top][All Lists]
Advanced

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

Re: [shell-script] Re: expressão regular


From: Josenivaldo Benito Junior
Subject: Re: [shell-script] Re: expressão regular
Date: Thu, 6 Dec 2007 10:06:12 -0200

Poxa Julio,

Vivendo e aprendendo com a história. Aqui no trabalho sempre uso o egrep nas
estações solaris e nunca tive a curiosidade de checar a diferença de
performance, tenho uns scripts grandes que posso estar perdendo em
performance sem necessidade do egrep.

Obrigado.

On 12/5/07, Julio C. Neves <address@hidden> wrote:
>
>   Fala André,
> vc está não está off-topic e ainda vou acrescentar umas dicas ao que vc
> falou:
>
> O Unix tem uma família composta por 3 caras: fgrep que não sabe nada de
> regexp, grep que só conhece regexps básicas e egrep que sabe tudo de
> regexp.
> Escrevi na ordem de performance onde cada um é cerca de 20% mais veloz que
> o
> seguinte.
>
> Qdo o Linux usa o egrep e o fgrep como scripts para chamar o grep -E e o
> grep -f respectivamente, temos o pior mundo possível, ou seja, sempre
> executaremos um o código mais pesado.
>
> Abraços,
> Julio
>
> Em 05/12/07, André Saunite <address@hidden <saunite%40gmail.com>>
> escreveu:
> >
> > Apenas para conhecimento histórico,
> >
> > Nos unix mais antigos o egrep é uma implementação diferente do grep,
> > com suporte a ER completas, como a versão GNU já foi desenvolvida com
> > todo esse suporte através da expressão "-E" o seu egrep é apenas um
> > shell script que chama o "grep -E" (até onde eu sei é apenas para
> > backward compatibility),
> >
> > Acho interessante divulgar esse tipo de coisa para evitar que usuários
> > que tem mais contato com UNIX através do Linux não desperdicem tempo
> > procurando por soluções de problemas desse tipo quando necessitarem
> > utilizar outras variações de UNIX,
> >
> > Por favor se eu estiver sendo "off-topic" me avisem! :o)
> >
> > Abs,
> > André
> >
> >
> > On Dec 5, 2007 5:04 PM, Flavio Junior <address@hidden<billpp%40gmail.com>
> <billpp%40gmail.com>>
> > wrote:
> > >
> > >
> > >
> > >
> > >
> > >
> > > Na real grep ou egrep (que nada mais é que o grep -E) ta sendo usado
> > > de forma errada.
> > > O grep retorna a LINHA toda que casar com a expressão, pra evitar isso
> > > precisa usar a opção "-o" do grep/grep -E.
> > >
> > > Ou seja, faça:
> > >
> > > $ grep -Eo 'expressão' arquivo
> > >
> > > Quanto ao site, não sei :)..
> > >
> > > --
> > >
> > > Flávio do Carmo Júnior
> > >
> > >
> > >
> > > On Dec 5, 2007 4:59 PM, André Saunite <address@hidden<saunite%40gmail.com>
> <saunite%40gmail.com>>
> > wrote:
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > Fala Benito!
> > > >
> > > > O problema é que você tá usando o grep em vez do egrep! O grep não é
> > > > muito bom com expressões regulares mais complexas, para essas é
> > > > preciso utilzar o egrep.
> > > >
> > > > [ 16:56:30:eandsau@ ~ $ ] echo GG48LH33|grep
> > > "([A-Z]{2}[0-9]{2})+[A-Z]{2}?"
> > > > [ 16:56:37:eandsau@ ~ $ ] echo GG48LH33|egrep
> > > > "([A-Z]{2}[0-9]{2})+[A-Z]{2}?"
> > > > GG48LH33
> > > >
> > > > Abração!
> > > > André Saunite
> > > >
> > > > On Dec 5, 2007 4:56 PM, Josenivaldo Benito Junior
> > > >
> > > >
> > > > <address@hidden <jrbenito%40benito.qsl.br><jrbenito%40benito.qsl.br>> 
> > > > wrote:
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > Só acrescentando,
> > > > >
> > > > > o site http://regexpal.com/
> > > > >
> > > > > Também interpreta ao ER do Thiago diferente. Ele da match em
> strings
> > de
> > > 6
> > > > > digitos mas não da match em 4 digitos nem em 8 como o sed. Alguma
> > > > > explicação
> > > > > para isso?
> > > > >
> > > > > Exemplo usado no site:
> > > > >
> > > > > JJ34 => não pega
> > > > > GG47LH => pega
> > > > > FG37LL33 => não pega
> > > > > FG37LL33JK ==> pega
> > > > >
> > > > > Todas são válidas. No sed fica assim:
> > > > >
> > > > >
> > > > > [rdlxsr02][wjb069_teDebug][/home/sw/wjb069]
> > > > > > cat ttt | sed -r 's/([A-Z]{2}[0-9]{2})+[A-Z]{2}?/|&|/'
> > > > > |JJ34|
> > > > > |GG47LH|
> > > > > |FG37LL33|
> > > > > |FG37LL33JK|
> > > > >
> > > > > Ou seja, pega todas!
> > > > >
> > > > > Muito obrigado,
> > > > > Benito.
> > > > >
> > > > >
> > > > > On 12/5/07, Josenivaldo Benito Junior 
> > > > > <address@hidden<jrbenito%40benito.qsl.br>
> <jrbenito%40benito.qsl.br>>
>
> > wrote:
> > > > > >
> > > > >
> > > > > > Oi,
> > > > > >
> > > > > > eu acho que expressei-me mau.
> > > > > >
> > > > > > não existe a forma
> > > > > >
> > > > > > GG482733 (que sua expressão pegaria)
> > > > > >
> > > > > > O formato correto é: duas letras+dois números+duas letras+dois
> > > > > > números+duas letras
> > > > > >
> > > > > > O comprimento total é no máximo 12, mas o mais comum é 4 ou 6
> como
> > > por
> > > > > > exemplo:
> > > > > >
> > > > > > GG48LH
> > > > > > GG67
> > > > > > GG48
> > > > > > JH32HG
> > > > > > ...
> > > > > >
> > > > > > É mais ou menos assim:
> > > > > >
> > > > > > GG -> indica uma grade grande (de latitude e longitude)
> (quadrada)
> > > > > > GG48 -> se você dividir o quadro GG em pedacinhos (o tamanho não
> > vem
> > > ao
> > > > > > caso), GG48 representa um dos pedacinhos de GG (um quadro)
> > > > > > GG48LH -> novamente, divide o quadro GG48 em vários pedaços e
> > GG48LH
> > > é
> > > > um
> > > > > > desses pedaços, GG48JG é outro e assim vai.
> > > > > >
> > > > > > Exemplo prático:
> > > > > >
> > > > > > O localizador da minha residência é GG67MH (com 6 digitos).
> > > Dependendo
> > > > da
> > > > > > aplicação eu posso informar:
> > > > > >
> > > > > > GG67 (menos preciso)
> > > > > > GG67MH (mais preciso)
> > > > > >
> > > > > > Então, o comum na aplicação é aparecerem localizadores, um por
> > linha,
> > > > > > assim:
> > > > > >
> > > > > > GG67
> > > > > > GG35AF
> > > > > > GG67MH
> > > > > > GG48LH
> > > > > > GG67LH
> > > > > > DF45OP
> > > > > > DF54
> > > > > >
> > > > > > Eventualmente podem aparecer:
> > > > > >
> > > > > > GG67AF33
> > > > > > JH34RD25ES
> > > > > >
> > > > > > Mas não estou me preocupando com estes casos, posso cortá-los em
> 6
> > > > > digitos
> > > > > > sem perda de informação relevante à minha aplicação. Cortando
> > esses
> > > > dois
> > > > > > exemplo fica:
> > > > > >
> > > > > > GG67AF
> > > > > > JH34RD
> > > > > >
> > > > > > Mas, não posso aumentar um grid de 4 digitos para para 6
> > > > arbitrariamente,
> > > > > > por exemplo:
> > > > > >
> > > > > > usuário entra com GG48
> > > > > > eu não posso assumir GG48LH ou GG48JH ou GG48EJ ... tenho que
> > > > considerar
> > > > > > apenas GG48
> > > > > >
> > > > > > O que eu tentei fazer inicialmente era consistir qualquer
> > sequencia
> > > > > > agrupada de duas letras+dois numeros+duas letras+dois numeros e
> > assim
> > > > por
> > > > > > diante. Só para ter certeza que não entrem coisas inválidas
> como?
> > > > > >
> > > > > > GGLH
> > > > > > ou
> > > > > > 2235
> > > > > > ou
> > > > > > 22LH
> > > > > > (tem que começar por letra obrigatoriamente e sempre apos duas
> > letras
> > > > vem
> > > > > > um numero, depois pode vir duas letras e assim vai)
> > > > > >
> > > > > > De fato, o que preciso é que, independente do comprimento (que
> eu
> > > > sempre
> > > > > > vou garantir ser maior que 4), a string comece por duas letras
> > > seguidas
> > > > > por
> > > > > > dois numeros, eventualmente seguidos por mais duas letras que,
> > > > > > eventualmente, podem estar seguidas de dois números e assim por
> > > diante.
> > > > > >
> > > > > > A expressão do Thiago acertou na lata. Mas, existe algum motivo
> > > > especial
> > > > > > para não funcionar no grep? Tipo:
> > > > > >
> > > > > > [rdlxsr02][wjb069_teDebug][/home/sw/wjb069]
> > > > > > > echo GG48LH|sed -r 's/([A-Z]{2}[0-9]{2})+[A-Z]{2}?/|&|/'
> > > > > > |GG48LH|
> > > > > >
> > > > > > [rdlxsr02][wjb069_teDebug][/home/sw/wjb069]
> > > > > > > echo GG48|sed -r 's/([A-Z]{2}[0-9]{2})+[A-Z]{2}?/|&|/'
> > > > > > |GG48|
> > > > > >
> > > > > > [rdlxsr02][wjb069_teDebug][/home/sw/wjb069]
> > > > > > > echo GG48LH33|sed -r 's/([A-Z]{2}[0-9]{2})+[A-Z]{2}?/|&|/'
> > > > > > |GG48LH33|
> > > > > >
> > > > > > [rdlxsr02][wjb069_teDebug][/home/sw/wjb069]
> > > > > > > echo GG48LH33|grep '([A-Z]{2}[0-9]{2})+[A-Z]{2}?'
> > > > > >
> > > > > > [rdlxsr02][wjb069_teDebug][/home/sw/wjb069]
> > > > > > > echo GG48LH33|grep "([A-Z]{2}[0-9]{2})+[A-Z]{2}?"
> > > > > >
> > > > > >
> > > > > > O grep não imprime o match. Comi bronha?
> > > > > >
> > > > > >
> > > > > > Obrigado pelas dicas de todos
> > > > > > Abraço
> > > > > > Benito
> > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > > > On 12/5/07, voyeg3r < address@hidden<voyeg3r%40yahoo.com.br>
> <voyeg3r%40yahoo.com.br>>
> > wrote:
> > > > > > >
> > > > > > > --- Em
> > > > > address@hidden<shell-script%40yahoogrupos.com.br><shell-script%40yahoogrupos.com.br>
> > <shell-script%40yahoogrupos.com.br>,
> > > > > > > "Josenivaldo Benito Junior"
> > > > > > > <jrbenito@...> escreveu
> > > > > > > >
> > > > > > > > Olá turma,
> > > > > > > >
> > > > > > > > Estou apanhando de uma expressão regular. Para ser sincero
>
> > não
> > > > > > > sei dizer
> > > > > > > > se ela é possível (deve ser o sono).
> > > > > > > >
> > > > > > > > Preciso pegar strings do tipo:
> > > > > > > >
> > > > > > > > GG48LH
> > > > > > > > JH23
> > > > > > > > JH45ER
> > > > > > > > FJ87SA76
> > > > > > > >
> > > > > > > > Resumindo:
> > > > > > > >
> > > > > > > > Sempre tem duas letras (de A até Z) seguidas de dois números
> > (de
> > > 0
> > > > > > > até 9),
> > > > > > > > podendo estar seguidos mais duas letras, podendo estar
> seguido
> > de
> > > > > > > mais dois
> > > > > > > > números. (duas letras,dois nros., duas letras, dois nros).
> Mas
> > a
> > > > > > > informação
> > > > > > > > pode ter 2,4,6 ou 8 letras (1,2,3 ou 4 conjuntos de letras e
> > > > > números).
> > > > > > > >
> > > > > > > > O que são essas coisas? Coordenadas em formato World
> Locator.
> > De
> > > > > > > fato podem
> > > > > > > > ir até 12 algarismos, o comum é 4 ou 6. Na aplicação que
> estou
> > > > > > > tentando
> > > > > > > > capturar podem chegar a 8.
> > > > > > > >
> > > > > > > > Tentei algumas coisas básicas. O mais próximo que cheguei
> foi:
> > > > > > > >
> > > > > > > > [A-Z]{2}[0-9]{2}
> > > > > > >
> > > > > > > ============================
> > > > > > > se o conjunto de números pode ir até 6 faça:
> > > > > > >
> > > > > > > [A-Z]{2}[0-9]{2,6}
> > > > > > >
> > > > > > > >
> > > > > > > > Que pega um par de letras somente se for seguido de um par
> de
> > > > > > > números. Para
> > > > > > > > uma string tipo GG48LH23JV vai funcionar em dois matches,
> tem
> > > algum
> > > > > > > problema
> > > > > > > > nisso?
> > > > > > > >
> > > > > > > > Pegar um par de letras+um par de números e assim por diante,
> > não
> > > > > > > resolve
> > > > > > > > toda a situação, pois em 90% dos casos são usados 6
> algarismos
> > > (ex:
> > > > > > > GG67MH).
> > > > > > > >
> > > > > > > > Alguém pode me dar uma dica?
> > > > > > > >
> > > > > > > > Valeu.
> > > > > > > > Benito
> > > > > > > >
> > > > > > > >
> > > > > > > > [As partes desta mensagem que não continham texto foram
> > > removidas]
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > > [As partes desta mensagem que não continham texto foram removidas]
> > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > > > --
> > >
> > > > ------------------------------------
> > > > André Marques Saunite
> > > > e-mail/MSN: address@hidden <saunite%40gmail.com><saunite%40gmail.com>
> > > > Linux User - 308676
> > > > ------------------------------------
> > > >
> > > >
> > > >
> > >
> >
> > --
> > ------------------------------------
> > André Marques Saunite
> > e-mail/MSN: address@hidden <saunite%40gmail.com><saunite%40gmail.com>
> > Linux User - 308676
> > ------------------------------------
> >
> >
> >
>
> --
> Abraços,
> Julio
> Feliz Natal
> :wq
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]