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

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

Re: Remover quebra de linha (UPDATE)


From: Cristiano Ferrari
Subject: Re: Remover quebra de linha (UPDATE)
Date: Mon, 15 Jun 2009 21:25:18 -0000
User-agent: eGroups-EW/0.82

> Agora não me pergunte o porque do '$!N', eu também não entendo.
> 

Tá bom... vá lá... faltou um pouco de boa vontade minha para entender a 
expressão.

Vamos atualizar algumas conclusões:

1. O 's/\n//g' sozinho não funciona (entrada e saída permanecem iguais). Pelo 
que meu parco conhecimento de sed me permite concluir, dado ao fato de que o 
sed, após processar a linha, a devolve como uma linha (e toda linha tem uma 
quebra de linha no final). Então, não é que o comando não funcione. Funciona, o 
sed realmente remove a quebra de linha, mas ao devolvê-la, a acrescenta denovo 
(para que continue sendo uma linha e não se emende com a próxima), certo?

2. Então, para que funcione, é necessário juntar a linha com a próxima, através 
do comando 'N', e remover a quebra de linha que ficou entre elas, correto? 
Então, por que não fazemos apenas sed 'N;s/\n//g'? Porque senão ele faz isso 
uma linha sim e a outra não. Veja:

root@mga0-fwall-dsl:~> for ID in $(seq 1 100) ; do echo "Linha $ID" ; done | 
sed 'N;s/\n//g'
Linha 1Linha 2
Linha 3Linha 4
Linha 5Linha 6
Linha 7Linha 8
Linha 9Linha 10
(...)
Linha 93Linha 94
Linha 95Linha 96
Linha 97Linha 98
Linha 99Linha 100

É claro! se o sed lê o arquivo linha por linha e na primeira linha quando eu 
mando juntar com a segunda a terceira passa a ser segunda. Logo, o comando não 
será executado na segunda linha original (que virou primeira), e assim por 
diante.

Então, o que o ':a' faz é marcar o início da primeira linha do arquivo antes de 
mexer nele e o 'ta' faz o sed retroceder à marcação 'a' (o início da primeira 
linha do arquivo) após a substituição ter sido realizada. É o tal do loop que o 
Aurélio mencionou.

Portanto, na instrução em questão, o ta não deixa o sed avançar, mas o for a 
executar a instrução sempre na primeira linha, mas antes, traz a linha seguinte 
para junto dela? Capiche?

Portanto, o que o '$!N' faz é simplesmente emendar a linha seguinte na linha 
atual antes da substituição. 

Então, o sed remove **as duas quebras de linha** (a do fim da primeira e a do 
fim da segunda linha), mas ao devolver a string, insere uma quebra nela para 
que ela continue sendo linha e não se emende com a linha seguinte do arquivo.

É isso pessoal mesmo pessoal?

Ah! Qual seria então a função do "$!", já que apenas o "N" funciona?

Vejam: http://pastebin.com/f4442ce6

Putz... se eu tivesse pensado 5 minutos mais, não tinha passado recibo! :)

Abraço





reply via email to

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