Selecionando string por padrão. [RESOLVIDO]

1. Selecionando string por padrão. [RESOLVIDO]

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 24/04/2012 - 16:59h

Hello folks!!

Então, tenho um aquivo com centenas de linhas, mas gostaria de jogar em outro arquivo
apenas as linhas que seguissem um determinado padrão.

Gostaria de salvar apenas as strings que começassem com uma letra A-Za-z na primeira posição,
um número na segunda posição 0-9, outra letra A-Za-z e outro número 0-9.
Detectado esse padrão salvar a linha em outro arquivo.

Exemplo do arquivo.

joão
maria
a1s2antonio
A1s2Marcia
laranja
p4k7silvio
1casa2
M7j3Pedro

A saída seria:
a1s2antonio
A1s2Marcia
p4k7silvio
M7j3Pedro

Quem puder me mostrar o caminho, lembrando que sou iniciante em shell script, e estou
aprendendo ainda repetições e as coisas mais básicas, essa de manipular strings de forma avançada
ainda estou perdido.

valeu.






2. MELHOR RESPOSTA

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 24/04/2012 - 18:04h

Feito...

egrep '^[A-Za-z][0-9][A-Za-z][0-9]' 


Agora a explicação de como foi feito fica por sua conta ;)



3. hohohoh

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 24/04/2012 - 18:15h

Bom é a cara de pokerface qdo a solução é tão simples pra um problema aparentemente chato. putz...

Grande AprendiNoLinux, sempre salvando a pátria, e sim, entendi o comando...
com aqueles links que vc me passou no outro post já ajudou muito. e cada exemplo vou melhorando mais.

todo dia aprendo uma coisa nova, vou fazendo coisas..
e sem ajuda seria bem mais complicado....
valeu d+ cara..


4. Re: Selecionando string por padrão. [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 24/04/2012 - 20:28h

doctorx777 escreveu:

Bom é a cara de pokerface qdo a solução é tão simples pra um problema aparentemente chato. putz...

Grande AprendiNoLinux, sempre salvando a pátria, e sim, entendi o comando...
com aqueles links que vc me passou no outro post já ajudou muito. e cada exemplo vou melhorando mais.

todo dia aprendo uma coisa nova, vou fazendo coisas..
e sem ajuda seria bem mais complicado....
valeu d+ cara..


kkkk
Aqui no VOL quando estava iniciando li um artigo que foi finalizado com a seguinte frase:


"Nunca desencorage ninguém que continuamente faz progresso, não importa quão devagar" Platão


Guardei esta mensagem com carinho porque me lembro bem como fui recebido quando não sabia nem como instalar o linux na minha máquina. Não que tenha evoluído muito, rsrs. Ainda estou apanhando para atualizar entre versões diferentes.
O importante é que o conhecimento só tem valor se compartilhado. Aprendi esta lição aqui no VOL e só estou retribuindo o que recebi quando aqui cheguei a mais ou menos 1 ano e pouco. ;)

Se não tem mais dúvidas, pode fechar o tópico por favor ?




5. opa...

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 25/04/2012 - 09:14h

Ae AprendiNoLinux, na verdade tenho outra dúvida sim.
depois da sua resposta já consegui fazer muita coisa no arquivo.

agora me falta limpar uns lixos, aqueles caracteres que ficam sem
ser reconhecido pelo editor.
preciso apagar todas as linhas que NÃO contenha os caracteres padrão (digamos "digitáveis do teclado)

Exemplo:

Input:

joaodoido���safdasd
joao1234
ZXCVB:!"�$%^:QWERTY:YUIP{/'?@~}QWE!"���
zxcvb12345
123454675670&*(%$%!@#$@#$%
)&*(%&$%:<><M<|\[~]

Output:

joao1234
zxcvb12345
123454675670&*(%$%!@#$@#$%
)&*(%&$%:<><M<|\[~]

depois da sua resposta eu tentei estabelecer os intervalos, funcionou muito bem
enquanto eu estava preso apenas a letras e numeros.
um [A-Za-z0-9] resolve meu problema em partes, mas eu não sei o "Range" para os
outros caracteres "digitáveis" de modo q elimine os lixos como no exemplo acima.

se puder dar uma força ai com mais essa, fico eternamente grato.

Valeu.



6. corrigindo...

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 25/04/2012 - 09:17h

O site aqui editou o caractere.
na verdade onde tem &#65533
é uma "interrogação dentro de uma caixinha" no editor aqui.
ou seja, um caractere que o editor nao conseguiu identificar.
não sei se consegui explicar. mas tudo bem...


7. Quase...

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 25/04/2012 - 09:58h

Fala ai AprendiNoLinux,

Acho que achei a resposta, mas não estou conseguindo fazer funcionar.
Lendo uns textos por ai encontrei esse pdf: http://aurelio.net/regex/apostila-conhecendo-regex.pdf

é um pdf muito legal sobre expressões regulares.

A resposta para minha ultima pergunta está na página 12 desse pdf.
ou seja, é so especificar o intervalo dos caracteres de acordo com a tabela
ASCII.

então olhando ali todos os "digitáveis" que me são conveniente, o intervalo seria do ! até o ~
só que ao usá-lo no egrep ele me retorna NADA.

$cat arquivo.txt | egrep [!-~]
de acordo com o texto isso deveria me mostrar todas as linhas que contém
caracteres nesse intervalo de acordo com a tabela ASCII.
mas não está dando certo,

tem alguma idéia do pq?

Valeu!!


8. Re: Selecionando string por padrão. [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 25/04/2012 - 10:05h

doctorx777 escreveu:

Ae AprendiNoLinux, na verdade tenho outra dúvida sim.
depois da sua resposta já consegui fazer muita coisa no arquivo.

agora me falta limpar uns lixos, aqueles caracteres que ficam sem
ser reconhecido pelo editor.
preciso apagar todas as linhas que NÃO contenha os caracteres padrão (digamos "digitáveis do teclado)

Exemplo:

Input:

joaodoido&#65533;&#65533;&#65533;safdasd
joao1234
ZXCVB:!"&#65533;$%^:QWERTY:YUIP{/'?@~}QWE!"&#65533;&#65533;&#65533;
zxcvb12345
123454675670&*(%$%!@#$@#$%
)&*(%&$%:<><M<|\[~]

Output:

joao1234
zxcvb12345
123454675670&*(%$%!@#$@#$%
)&*(%&$%:<><M<|\[~]

depois da sua resposta eu tentei estabelecer os intervalos, funcionou muito bem
enquanto eu estava preso apenas a letras e numeros.
um [A-Za-z0-9] resolve meu problema em partes, mas eu não sei o "Range" para os
outros caracteres "digitáveis" de modo q elimine os lixos como no exemplo acima.

se puder dar uma força ai com mais essa, fico eternamente grato.

Valeu.


Quando fiz o quote deu para ver os reais valores dos caracteres.
Já que você não sabe o local em que irão ocorrer, vamos mudar a abordagem do problema.
Em vez de tentar descobrir quem está errado, vamos dizer quem está certo e inverter a lógica.
Então o filtro será:

[:alnum:] = Letras e dígitos. ou [:graph:] Caracteres imprimíveis. o problema é que não inclui espaços.
Já o [:print:] inclui espaços.

Veja qual atende melhor o seu padrão de filtro. Mesmo que não faça ainda o trabalho completo em um comando, você sempre poderá continuar o filtro na mesma linha igual foi feito no outro dia ok ?

Na dúvida, mande aí.



9. Re: Selecionando string por padrão. [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 25/04/2012 - 10:06h

doctorx777 escreveu:

Fala ai AprendiNoLinux,

Acho que achei a resposta, mas não estou conseguindo fazer funcionar.
Lendo uns textos por ai encontrei esse pdf: http://aurelio.net/regex/apostila-conhecendo-regex.pdf

é um pdf muito legal sobre expressões regulares.

A resposta para minha ultima pergunta está na página 12 desse pdf.
ou seja, é so especificar o intervalo dos caracteres de acordo com a tabela
ASCII.

então olhando ali todos os "digitáveis" que me são conveniente, o intervalo seria do ! até o ~
só que ao usá-lo no egrep ele me retorna NADA.

$cat arquivo.txt | egrep [!-~]
de acordo com o texto isso deveria me mostrar todas as linhas que contém
caracteres nesse intervalo de acordo com a tabela ASCII.
mas não está dando certo,

tem alguma idéia do pq?

Valeu!!


Sim. Você pensou certinho rsrs. Vou tentar...


10. Re: Selecionando string por padrão. [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 25/04/2012 - 10:23h

Pergunta:


Output: Tem que sobrar estes ? #Opção1

joao1234
zxcvb12345
123454675670&*(%$%!@#$@#$%
)&*(%&$%:<><M<|\[~]





Ou deve sobrar só estes ? #Opção2
joao1234
zxcvb12345



Se for só este do final tá fácil.

 egrep -v '[[:punct:]]'


Onde [:punct:] = caracteres de pontuação. Mas ele é muito restritivo e pode remover quem você não deseja. O -v mostra só quem não tem pontuação. Mas se o correto for a #opação1, voltamos ao alnum, alpha ou cntrl.

Me diga qual o certo.


11. ..

Leandro Medeiros
doctorx777

(usa Ubuntu)

Enviado em 25/04/2012 - 10:56h

Na verdade AprendiNoLinux tem que sobrar esses:

joao1234
zxcvb12345
123454675670&*(%$%!@#$@#$%
)&*(%&$%:<><M<|\[~]

Pra ficar mais fácil o que eu quero:
olhando aquela tabela ASCII do link que coloquei, quero só os caracteres
do ! até o ~ que são respectivamente os numeros de 33 a 126 da tabela.

qualquer caractere fora desse range, deverá ser excluída a linha toda.

é isso ai.


12. Re: Selecionando string por padrão. [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 25/04/2012 - 14:23h

doctorx777 escreveu:

Na verdade AprendiNoLinux tem que sobrar esses:

joao1234
zxcvb12345
123454675670&*(%$%!@#$@#$%
)&*(%&$%:<><M<|\[~]

Pra ficar mais fácil o que eu quero:
olhando aquela tabela ASCII do link que coloquei, quero só os caracteres
do ! até o ~ que são respectivamente os numeros de 33 a 126 da tabela.

qualquer caractere fora desse range, deverá ser excluída a linha toda.

é isso ai.


ok, tentando....





01 02