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

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

[RESOLVIDO] Re: [shell-script] Retornar pesquisa de um bloco de arquivos


From: Robson Alexandre
Subject: [RESOLVIDO] Re: [shell-script] Retornar pesquisa de um bloco de arquivos
Date: Mon, 26 Sep 2011 16:43:24 -0300

Caro Miranda,

consegui de uma forma com sed
Segue a solução genérica:

sed -n ':a;/}/!{N;ba};/PADRAO A SER PESQUISADO/p' temp.txt

no meu caso estou utilizando:

sed -n ':a;/}/!{N;ba};/TEL;CELL/p' temp.txt
Comentários:
:a; # Enquanto:
/}/!{ # Não encontrar o fecha chaves
N; # Junte com a linha seguinte
ba # E repita
};
//{ # Senão (se encontrar o fecha chaves)
/TEL;CELL/p # Se existir "TEL;CELL", imprima
}
Dica enviada pelo Márcio Gil.

e daí consigo trabalhar com o padrão, fazendo substituições ou qualquer
outra coisa.
Valeu pela dica do awk.

Atenciosamente

Robson Alexandre

Em 26 de setembro de 2011 15:23, miranda <address@hidden> escreveu:

> **
>
>
> Cara , até fiz aqui mas não ficou nada trivial( deve ter jeito bem mais
> simples ):
> [miranda@guitar ~]$ cat xuh.txt
>
> {
> BEGIN:VCARD
> VERSION:2.1
> TEL;HOME:1132333233
> TEL;VOICE:1188888888
> EMAIL;INTERNET:address@hidden
> NOTE:Categories: Unfiled
> END:VCARD
> }
> {
> BEGIN:VCARD
> VERSION:2.1
> N:Santos;TI;;;
> FN:TI Santos
> EMAIL;INTERNET:address@hidden
> END:VCARD
> }
> {
> BEGIN:VCARD
> VERSION:2.1
> N:da Silva;Xunda;;;
>
> FN:Betrano da Silva
> TEL;CELL:1199999999
> EMAIL;INTERNET:address@hidden
>
> END:VCARD
> }
> {
> BEGIN:VCARD
> VERSION:2.1
> N:da Silva;Beltrano;;;
> FN:Betrano da Silva
> TEL;CELL:1199999999
> EMAIL;INTERNET:address@hidden
> END:VCARD
> }
> {
> BEGIN:VCARD
> VERSION:2.1
> N:Santos;TI;;;
> FN:TI Santos
> EMAIL;INTERNET:address@hidden
> END:VCARD
> }
> {
> BEGIN:VCARD
> VERSION:2.1
> N:da Silva;Capistrano;;;
> FN:Capistrano da Silva
> TEL;CELL:1199999999
> EMAIL;INTERNET:address@hidden
> END:VCARD
> }
>
> [miranda@guitar ~]$ cat cmd.awk
> BEGIN{OK=0;k=0}
> $0 ~/{/ {BLOCO[k++]=NR}
> $0 ~/TEL;CELL/ {OK=1}
> $0 ~/}/ { if ( OK )
> BLOCO[k++]=NR
> else k--;OK=0}
> END{k=0;while ( BLOCO[k] ) {comando=sprintf("sed -n %c%s,%sp%c xuh.txt
> \n",34,BLOCO[k++],BLOCO[k++],34);system(comando)}}
>
> [miranda@guitar ~]$ awk -f cmd.awk xuh.txt
>
> {
> BEGIN:VCARD
> VERSION:2.1
> N:da Silva;Xunda;;;
>
> FN:Betrano da Silva
> TEL;CELL:1199999999
> EMAIL;INTERNET:address@hidden
>
> END:VCARD
> }
> {
> BEGIN:VCARD
> VERSION:2.1
> N:da Silva;Beltrano;;;
> FN:Betrano da Silva
> TEL;CELL:1199999999
> EMAIL;INTERNET:address@hidden
> END:VCARD
> }
> {
> BEGIN:VCARD
> VERSION:2.1
> N:da Silva;Capistrano;;;
> FN:Capistrano da Silva
> TEL;CELL:1199999999
> EMAIL;INTERNET:address@hidden
> END:VCARD
>
> }
>
> On Mon, 2011-09-26 at 13:27 -0300, Robson Alexandre wrote:
>
> >
> >
> > Caros colegas,
> >
> > estou quebrando a cabeça para tentar executar esta tarefa de uma
> > maneira simples e peço a ajudas d[oa]s senhor[ea]s.
> > Tenho um arquivo com o formato
> >
> > {
> > BEGIN:VCARD
> > VERSION:2.1
> > TEL;HOME:1132333233
> > TEL;VOICE:1188888888
> > EMAIL;INTERNET:address@hidden
> > NOTE:Categories: Unfiled
> > END:VCARD
> > }
> > {
> > BEGIN:VCARD
> > VERSION:2.1
> > N:Santos;TI;;;
> > FN:TI Santos
> > EMAIL;INTERNET:address@hidden
> > END:VCARD
> > }
> > {
> > BEGIN:VCARD
> > VERSION:2.1
> > N:da Silva;Beltrano;;;
> > FN:Betrano da Silva
> > TEL;CELL:1199999999
> > EMAIL;INTERNET:address@hidden
> > END:VCARD
> > }
> >
> > e gostaria de trazer por exemplo os blocos entre { } que possuam
> > TEL;CELL resultando no caso acima em :
> >
> > {
> > BEGIN:VCARD
> > VERSION:2.1
> > N:da Silva;Beltrano;;;
> > FN:Betrano da Silva
> > TEL;CELL:1199999999
> > EMAIL;INTERNET:address@hidden
> > END:VCARD
> > }
> >
> > o problema é q se faço sed '/{/,/}/' para trabalhar com o intervalo
> > entre colchetes ele pega o primeiro { e o último } do arquivo, não
> > consigo restringir ao primeiro }.
> >
> > Att
> > Robson Alexandre
> >
> >
> >
> >
>
> [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]