sed, parte IX: Hold Space ou Espaço Reserva

parte I: O que é e para que serve
parte II: Enviando dados pro sed
parte III: Selecionando as linhas em que vamos trabalhar
parte IV: Substituindo
parte V: Scripts em sed
parte VI: Expressões Regulares
parte VII: Referenciando com &
parte VIII: Back Reference
parte IX: Hold Space ou Espaço Reserva
parte X: Por onde prosseguir e Considerações Finais
parte XI: Comandos de uma linha só



É um espaço temporário do sed, onde podemos inserir e extratir algumas informações de lá. Diferente do espaço padrão, o buffer do sed, o espaço reserva não permite que editemos coisas nele, permite apenas o anexamento ou inserçãoo de linhas.
Nessa de colocar algo no buffer, passar pro hold, escrever algo novamente buffer e depois pegar a informação que estava no hold, podemos fazer magias.

Há 3 comandos básicos para lidar com o Hold Space:
h ou H    Sobrescreve(h) ou anexa(H) no hold space um conteúdo do buffer.
g ou G    Sobrescreve(g) ou anexa(G) no buffer um conteúdo do hold space.
x    Troca os conteúdos do buffer e hold space.


Ok, vamos a mágica:
cat teste.txt | sed -ne '1!G' -e 'h' -e '$p'
Nosse teste.txt é um arquivo numerado de 1 a 6, um número por linha.

Uma análise sobre a função de cada comando:
1!G:    se a linha que está sendo atualizada não for a primeira, anexa no buffer o que está no hold space
h:    coloca no hold space o que está no buffer
$p:    se a linha atual for a última, imprimir
   
Vamos fazer como o sed faz, analisar linha por linha:

1a. Linha:
Primeiro comando: não é executado.
Segundo comando: colocamos o número 1 no hold space.
Terceiro comando: não executa.

2a Linha:
Primeiro comando: no buffer temos o 2, e anexamos o 1 a ele (estava no hold)
Segundo comando: coloca 2 e 1 no hold
Terceiro comando: nada

3a Linha:
Primeiro comando: no buffer temos 3, e anexamos o 2 e o 1(estavam no hold)
Segundo comando: colocamos 3, 2 e 1 no hold
Terceiro comando: nada

4a Linha:
Primeiro comando: no buffer temos o 4, e anexamos 3,2 e 1(estavam no hold)
Segundo comando: colocamos 4, 3, 2 e 1 no hold
Terceiro comando: nada

Ou seja, é fácil ver que, quando estamos numa linha do arquivo, todas as anteriores estão no hold.
E adicinamos ao buffer atual o que está no hold, ou seja, adicionamos a linha atual todas as linhas anteriores.
Lembrando que, ao adicionar, não estavamos adicionando uma nova linha, e sim o número ao final da linha atual do buffer.

Quando chegarmos na última linha, a 6, adicionamos o que está no hold: 5 4 3 2 1.

Ou seja, esse script imprime um arquivo ao contrário, da última para a primeira linha.

Nenhum comentário:

Veja também: