Está faltando uma versão sed
pura! Isso fará:
sed 'x;G;s/\(.*\)\n$/+/;/\n/d;h;s/^+\{2\}//;/^+/d' file
Substitua o 2
por 29
por 30 linhas consecutivas. Eu me pergunto se isso pode ser otimizado de alguma forma.
Como funciona: No espaço de espera, a linha anterior é mantida, com um +
para cada ocorrência adicional. Agora, para cada linha, o x
troca os buffers, portanto, a linha atual está no espaço de armazenamento. O G
anexa o espaço de espera, portanto, no espaço de padrão, temos a linha antiga e a nova, separadas por uma nova linha. Agora, se a linha aparecer antes e depois da nova linha, teremos duas linhas idênticas e o comando s
substituirá uma delas pela nova linha por +
. Se ainda houver uma nova linha no padrão, as linhas serão diferentes e poderemos iniciar um novo ciclo ( /\n/d
). Caso contrário, copie a linha modificada para o espaço de espera para coletar o +
. Por fim, remova quantas +
as linhas forem necessárias (menos um). Se ainda houver um +
líder, teríamos linhas demais ou não suficientes, então d
elete.