On Mon, Jun 15, 2009 at 08:53:47PM -0000, Cristiano Ferrari wrote:
> --- Em shell-script@yahoogrupos.com.br, César Vianna <cesar.via...@...> 
> escreveu
> >
> > Opa! Valeu, Cristiano. Funcionou perfeitamente.
> > 
> > Só não entendi a expressão que remove as quebras. O que é a expressão
> > :a;$!N;  ? e o ta ?
> > 
> > sed ':a;$!N;s/\n/ /g;ta; s/ID§/\nID§/g'
> 
> O comando ':' define uma marcação (no caso, marcação chamada 'a'). O comando 
> 't' é um pulo condicional, que pula até uma marcação se o último s/// 
> funcionou. Poranto, 'ta' pula até a marcação 'a' definida no primeiro 
> comando, se o 's/\n/ /g' funcionou.
> 
> Agora não me pergunte o porque do '$!N', eu também não entendo.
> 
> Retirei esta dica do site do Aurélio 
> (http://www.aurelio.net/sed/sed-HOWTO/sed-HOWTO-7.html) faz um bom tempo e 
> nunca compreendi totalmente sua lógica. Alguém da lista pode explicar?
> ------------------------------------

podemos tentar,
$!N = na última linha não apensar com a próxima;

quanto ao código:
  sed ':a;$!N;s/\n/ /g;ta; s/ID§/\nID§/g'
pelo menos nos meus testes é bem mais lento que fazer:
  tr '\n' ' ' < arquivo | sed 's/ID§/\nID§/g'

uma alternativa seria usar:
  sed '1{h;d};/^ID§/{x;s/\n/ /g;p;g;d};H;d' arquivo

a complexidade aumenta bastante, mas nesse caso a performace é 
equivalente ao exemplo com o tr.


-- 
"Não manejo bem as palavras
Mas manipulo bem as strings."
------------------------------

Responder a