[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] pegar um trecho
From: |
Fabiano Caixeta Duarte |
Subject: |
Re: [shell-script] pegar um trecho |
Date: |
Thu, 3 Dec 2009 21:06:46 -0200 |
2009/12/2 Julio C. Neves <address@hidden>:
> Pô Fabiano,
> essa foi demais!!! Grande sacada!!! Quem te disse que não é elegante?
> Elegantíssimo...
>
> Achei a sacada do eval fantástica. Se vc não se incomodar, vou botar este
> exemplo no meu livro.
>
> Se não fosse o uso do eval, poderia assegurar que esta solução é bem mais
> rápida que a que fiz usando sed, mas assim mesmo ainda acho que deve ser
> mais veloz. Será que o dono do arquivo pode testar isso e postar na lista?
>
> Fabiano aproveite e explique para o pessoal da lista a tua solução pq muita
> gente não deve ter entendido.
>
> 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 Fabiano Caixeta Duarte <address@hidden>
>
>>
>>
>> 2009/12/1 Jeferson Santos <address@hidden<jefersondossantos%40gmail.com>
>> >:
>> > Olá Lista,
>> > Tenho uma linha que é mais ou menos assim:
>> >
>> > Model=Samsung 0411N, Serial=00000005464, blablabla=asdadqddq
>> >
>> > Acontece que eu quero pegar apenas o modelo exato, que seria "Samsung
>> > 0411N".
>> > Atualmente eu faço sed 's/Model=//;s/,.*$//'
>> > Mas sei que com sed tem como eu ser mais elegante que isso e pegar o que
>> > fica entre Model= e a virgula, mas sem pegar elas.
>> >
>> > Podem me ajudar?
>> >
>> > Abraços
>> >
>> >
>> >
>> > --
>> > Abraços,
>> > Jeferson Santos
>> >
>> >
>>
>> Não é elegante, mas é bash-only ;)
>>
>> linha=$(<arquivo); linha=${linha// /_};eval ${linha%%,*}; echo ${Model//_/
>> }
>>
>> Se não houvesse espaços, ficaria mais simples:
>> linha=$(<arquivo); eval ${linha%%,*}; echo $Model
>>
>> --
>> Fabiano Caixeta Duarte
>> Especialista em Redes de Computadores
>> Linux User #195299
>> Ribeirão Preto - SP
Ulalá!!! :P
Não é sempre que ganhamos um elogio destes do mestre :D
Desculpem-me pela demora em responder... uma virose me derrubou
Grande Júlio, coloque o exemplo no livro sim!
Senhores, a explicação:
Por questões de didática, vamos começar com um caso mais simples em
que não há espaços em branco.
Vamos assumir que a linha original seja:
Model=Samsung0411N, Serial=00000005464, blablabla=asdadqddq
#carregar a linha em uma variável
linha=$(<arquivo);
#utilizando a vírgula como delimitador, vamos pegar o primeiro campo
como se fosse o resultado de um cut -d, -f1
echo ${linha%%,*};
Model=Samsung0411N
Isto não é exatamente a sintaxe de um atribuição de valor a uma
variável? Podemos nos valer disto e utilizar o eval para executar esta
string como se fosse um comando.
eval ${linha%%,*};
Agora, temos uma variável Model com o conteúdo desejado :D
echo $Model
Samsung0411N
Agora, como a solicitação da thread envolvia um caracter de espaço,
que provocaria erro no eval, tivemos que substituir os espaços por um
caracter qualquer que não atrapalhasse.
linha=${linha// /_}
E, no final, precisamos devolver o espaço ao seu devido lugar
echo ${Model//_/ }
Claro?
--
Fabiano Caixeta Duarte
Especialista em Redes de Computadores
Linux User #195299
Ribeirão Preto - SP