[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