Sed - Introdução
Introdução ao Sed, por meio de exemplos, cobrindo os tópicos: enviando dados pro sed, selecionando as linhas para edição, substituição, scripts em sed, expressões regulares, referências por &, back reference, hold space/ espaço reserva, dicas de comandos, jogos, exemplos e material para prosseguir nos estudos sobre Sed.
Parte 7: Hold space
Também conhecido como espaço reserva, é um espaço temporário do sed, onde podemos inserir e extrair 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 que coloquemos e tiremos 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:
OK, vamos à mágica:
cat teste.txt | sed -ne '1!G' -e 'h' -e '$p'
Nosso "teste.txt" é um arquivo numerado de 1 a 6.
Uma análise sobre a função de cada comando:
Vamos fazer como o sed faz, analisar linha por linha.
1ª) Linha:
2ª) Linha:
3ª) Linha:
4ª) Linha:
Ou seja, é fácil ver que, quando estamos numa linha do arquivo, todas as anteriores estão no hold. E adicionamos ao buffer atual o que está no hold, ou seja, adicionamos a linha atual todas as linhas anteriores.
Lembrando que, ao adicionar, não estávamos adicionando uma nova linha, e sim o número ao final da linha atual do buffer.
Quando chegarmos na última linhas, a 6ª, adicionamos o que está no hold: 5 4 3 2 1
Ou seja, este script imprime um arquivo ao contrário, da última para a primeira linha.
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 à mágica:
cat teste.txt | sed -ne '1!G' -e 'h' -e '$p'
Nosso "teste.txt" é um arquivo numerado de 1 a 6.
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.
1ª) Linha:
Primeiro comando: não é executado.
Segundo comando: colocamos o número 1 no hold space.
Terceiro comando: não executa.
2ª) 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.
3ª) 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.
4ª) 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 adicionamos ao buffer atual o que está no hold, ou seja, adicionamos a linha atual todas as linhas anteriores.
Lembrando que, ao adicionar, não estávamos adicionando uma nova linha, e sim o número ao final da linha atual do buffer.
Quando chegarmos na última linhas, a 6ª, adicionamos o que está no hold: 5 4 3 2 1
Ou seja, este script imprime um arquivo ao contrário, da última para a primeira linha.