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: André Saunite
Subject: Re: [shell-script] Re: expressão regular
Date: Wed, 5 Dec 2007 17:27:28 -0200

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> 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> 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> 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> 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> wrote:
>  > > > >
>  > > > > --- Em
>  > > address@hidden<shell-script%40yahoogrupos.com.br>,
>  > > > > "Josenivaldo Benito Junior"
>  > > > > <jrbenito@...> escreveu
>  > > > > >
>  > > > > > Olá turma,
>  > > > > >
>  > > > > > Estou apanhando de uma expressão regular. Para ser sincero já 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
>  > Linux User - 308676
>  > ------------------------------------
>  >
>  >
>  >
>  



-- 
------------------------------------
André Marques Saunite
e-mail/MSN: address@hidden
Linux User - 308676
------------------------------------


reply via email to

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