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

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
>  ------------------------------------
>
>
>  


reply via email to

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