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

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

Re: [shell-script] pegar um trecho


From: Julio C. Neves
Subject: Re: [shell-script] pegar um trecho
Date: Tue, 1 Dec 2009 15:27:27 -0200

Fala Marcio,
realmente eu tive uma bobeada na interpretação, pois aparentemente deveriam
ser alteradas as linhas somente as linhas com a cadeia Model= e as outras
permaneceriam imutáveis, porém foi isso que seu código propôs e a minha
proposta fazia a mesma coisa.

Então, me retratando, para imprimir somente as linha que possuem a cadeia
Model= pelo cmd sed, me ocorrem 2 processos:
1 - O que vc falou, usando a opção -n junto com o cmd p do sed, mas com uma
observação interessante: vc fez echo $linha, qdo deveria ter feito echo
"$linha". Sem as aspas, o <enter> virou espaço em branco e o resultado foi
prejudicado. No outro exemplo vc fez echo linha, se esquecendo de usar $ e
por isso não voltou nada. Veja o que acontece se usar o $:
$ echo $linha | sed -n '/Model=/s/Model=\([^,]*\).*$/\1/p'
Samsung 0411N
$ echo "$linha" | sed -n '/Model=/s/Model=\([^,]*\).*$/\1/p'
Samsung 0411N

Ambos tiveram o mesmo resultado, porém é o que está entre aspas o mais
correto. O ideal seria fazer:
$ sed -n 's/Model=\([^,]*\).*$/\1/p' <<< "$linha"
Samsung 0411N

2 - Usando o cmd d (deleta) do sed, que ficaria assim:
$ echo "$linha" | sed '/Model=/!d;s/Model=\([^,]*\).*$/\1/'
Samsung 0411N
ou, melhorando,
$ sed '/Model=/!d;s/Model=\([^,]*\).*$/\1/' <<< "$linha"
Samsung 0411N

Finalizando, entre as propostas apresentadas, eu ficaria com:
$ sed -n 's/Model=\([^,]*\).*$/\1/p' <<< "$linha"
Samsung 0411N

Abraços,
Julio
Cursos de Shell e Zenity em 2 fins de semana?
- Em SP ligue (11) 2125-4747 Curso de 07 a 11/12;
- Em DF ligue (61) 3223-3000 Curso de zenity 09-10/01;
- No RJ ligue (21) 2561-0867 Curso nos dias 5,6,12,13/12;
- Turmas fechadas em outras cidades ligue (21) 8112-9988.


2009/12/1 Marcio Gil <address@hidden>

>
>
>
>
> > -----Original Message-----
> > From: Julio C. Neves
> >
> > 2009/12/1 Marcio Gil <address@hidden <marciomgil%40bol.com.br>>
> > >
> > > $ linha="Model=Samsung 0411N, Serial=00000005464,
> > > blablabla=asdadqddq"
> > > $ echo $linha | sed 's/Model=\([^,]*\).*$/\1/'
> > > Samsung 0411N
> > > $
> > >
> > > O "sed" acima substitui a linha pelo que está após "Model=" e
> que
> > > não contenha ",". Cuidado apenas com as linhas que não contem
> > > "Model=", pois neste caso o "sed" retornaria a linha inteira.
> > >
> > Marcio, a sua sacada foi excelente, mas esta última limitação que
> vc
> > colocou, pode ser contornada se fizermos:
> >
> > $ sed '/Model=/s/Model=\([^,]*\).*$/\1/' Arquivo
> >
>
> Desculpe Julio, mas não funciona:
>
>
> $ linha="Model=Samsung 0411N,
> Serial=00000005464,blablabla=asdadqddq"
> $ echo $linha | sed '/Model=/s/Model=\([^,]*\).*$/\1/'
> Samsung 0411N
> $ echo linha | sed '/Model=/s/Model=\([^,]*\).*$/\1/'
> linha
> $
>
> Imprimiu a linha inteira mesmo quando não havia "Model=".
>
> No entanto funciona desta maneira:
>
> $ echo $linha | sed -n '/Model=/s/Model=\([^,]*\).*$/\1/p'
> Samsung 0411N
> $ echo linha | sed -n '/Model=/s/Model=\([^,]*\).*$/\1/p'
> $
>
> Mas desta forma nem precisa repetir o padrão:
>
> $ echo $linha | sed -n 's/Model=\([^,]*\).*$/\1/p'
> Samsung 0411N
> $ echo linha | sed -n 's/Model=\([^,]*\).*$/\1/p'
> $
>
> O "-n" suprime a impressão automatica, então o comando "p" imprime
> apenas se houver "Model=".
>
> Abraço.
>
> Marcio Gil.
>
>  
>


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



reply via email to

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