sed '$n;h;N;/^\(.\).*\n/g;/\n/P;//!G;D' <in >out
Há um script sed
que faz isso.
Funciona assim:
- Se a linha atual for a última, imprima-a como padrão e termine o script.
- Se não, salve uma cópia da linha atual para manter o espaço.
- Em seguida, anexe a próxima linha de entrada ao espaço padrão.
- Se o primeiro caractere em espaço de padrão for idêntico ao primeiro caractere na linha que acabou de anexar, substitua o espaço de padrão pela cópia do espaço de espera salva.
- Se não, ainda teremos um
\n
ewline no espaço padrão, caso em que devemos Imprimir apenas até esse ponto.
- Se não, obtenha outra cópia de nossa linha retida anexada ao espaço padrão.
- Independentemente, exclua até a primeira nova linha no espaço padrão e comece novamente da parte superior do script com o que resta.
Essencialmente, ele trabalha com duas linhas por vez, imprimindo somente o primeiro quando o primeiro caractere na segunda linha não corresponde ao da primeira linha e substitui recursivamente as que fazem com a primeira ocorrência de uma série. E assim, ele pode manipular de maneira rápida e adequada a entrada de qualquer tamanho com o mínimo de buffering e apertar uma primeira série de correspondência de caracteres de qualquer tamanho a apenas sua primeira ocorrência. Ele funcionará com entrada em tempo real ou então com um arquivo, mas nunca precisará ler ou armazenar mais do que uma cópia da linha atual e da próxima.