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

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

Re: [shell-script] Replace de informação em arquivo do tipo texto


From: Gustavo Chaves
Subject: Re: [shell-script] Replace de informação em arquivo do tipo texto
Date: 18 Mar 2005 14:23:58 -0300
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3

>>>>> On Fri, 18 Mar 2005 09:10:42 -0300, Julio Cezar Neves - DATAPREVRJ 
>>>>> <address@hidden> said:

  > Olá Gustavo, venho admirando bastante a sua colaboração e o seu
  > alto nível de programação em shell. Quero ressaltar no entanto
  > que, conforme está escrito no rodapé de *_todas as msgs da nossa
  > lista_*, a abordagem de outras linguagens não é permitido.

Obrigado, Julio.  Eu sabia que mais dia menos dia eu iria acabar
levando um pito. :-)

Mas esta regra me parece um tanto radical.  Afinal, eu considero o AWK
e mesmo o sed como linguagens de programação (você deve conhecer o
sed-sokoban (http://aurelio.net/sed/sokoban/sokoban.sed.html) do
Aurélio) e é difícil encontrar algum shell-script que processe texto e
que não tenha ao menos um one-liner sed ou awk, não é?

Me parece claro que este não seria o forum para discutir um script que
comece com um "#!/bin/sed" ou um "#!/bin/awk".  Certamente, não um
script com um "#!/bin/perl".  Mas qual é a diferença entre discutir um
script em que apareça um one-liner perl e outro em que apareça um
one-liner sed ou awk?

No caso específico do exemplo que eu dei usando um one-liner perl, eu
precisaria fazer um contorcionismo maior pra obter o mesmo resultado
em sed porque ele é um editor de stream e eu preciso mexer com um
arquivo temporário:

  find /path/to/lib -name '*.cc' | sed 's/.*/mv & &.bkp; sed 
"s:\barquivo_antigo\.exe\b:arquivo_novo.exe:g" | sh

Ou com ed, porque é mais chato passar a string de comandos pra ele
(sem falar que o ed dá erro se não conseguir substituir a string):

  find /path/to/lib -name '*.cc' | while read f; do
      ed -s $f <<EOF
  1,\$s:\barquivo_antigo\.exe\b:arquivo_novo.exe:g
  w
  q
  EOF
  done

  > Pelo conhecimento de shell que vc tem demonstrado, tenho certeza
  > que saberia dar esta resposta usando somente este interpretador,
  > gerando um script mais otimizado (para o computador) pois evitaria
  > carregar todo o interpretador perl, fazer uma pré-compilação e
  > executar a saída do find.

Como você viu eu tentei.  O resultado em Perl é um pouco menos
eficiente. (A solução com o ed ficou 8% mais rápida e a com o sed
ficou 26% mais rápida.)  Mas eu levei *muito* mais tempo pra escrever
estas duas que a primeira.  Além disso, a com Perl é bem mais fácil de
entender.

E, na verdade, raramente eu me preocupo com eficiência de cara.
Primeiro eu tento escrever o código mais simples possível.  Depois eu
testo e mexo até funcionar.  Só depois é que eu vou me preocupar com
eficiência e só se eu sentir que vai precisar.  (Aliás, citando o
Hoare: "Premature optimisation is the root of all evil".)  Obviamente,
isto depende do contexto.  Mas neste caso em particular, como
provavelmente se trata de um script pra rodar uma vez e jogar fora, a
velocidade de programação é mais importante que a velocidade do
script.

  > Por favor continue cooperando para manter a lista no alto padrão
  > que ela se encontra, porém abstendo-se de sair do seu tema.

Vou tentar, mas eu sinceramente gostaria que você revisse a regra e a
deixasse mais clara.  Na minha opinião, deveriam ser permitidos
one-liners em qualquer linguagem.

Gustavo.


reply via email to

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