Como faço para reverter a ordem das entradas de log nesse arquivo? (Vim de preferência)

0

Eu tenho um conjunto de arquivos que contêm anotações escritas na ordem inversa:

###### 27/07/2016-15:04:20 GMT+1:
Really? More? 

###### 27/07/2016-15:04:18 GMT+1:
It happened again! 

###### 27/07/2016-15:04:16 GMT+1:
A thing happened

Gostaria que eles aparecessem nesta ordem:

###### 27/07/2016-15:04:16 GMT+1:
A thing happened

###### 27/07/2016-15:04:18 GMT+1:
It happened again! 

###### 27/07/2016-15:04:20 GMT+1:
Really? More? 

Alguns desses arquivos têm centenas de entradas - qual é a maneira mais fácil de fazer isso acontecer?

    
por Joe 27.07.2016 / 16:06

2 respostas

3

Apenas tac

O comando tac pode fazer isso.

$ tac -b -s "######" file.log

Chamada tac por Vim

Se você quiser executá-lo no Vim:

:%!tac -b -s "\#\#\#\#\#\#"

% significa todas as linhas.

! executa comando externo .

A barra invertida é necessária para escapar do sinal numérico # in "\#\#\#\#\#\#" .

Apenas Vim

Esses comandos substituem nova linha por guia. Se a guia estiver presente no log, use outro caractere em vez de uma guia.

:%s/\n/\t/g
:%s/\t######/\r######/g
:g/^/m0
:%s/\t/\r/g
    
por 27.07.2016 / 16:30
1

Se houver uma nova linha final no final, o comando a seguir faz o que você deseja no Vim:

g/^###/.,/^$/m 0

O que procura por linhas que começam com ### leva o intervalo de ### até a próxima linha em branco e a move para o topo.

Se não houver nova linha final, ela provavelmente será anulada com, e. E16: invalid range , nesse caso você poderia ajustar o regex assim:

g/^###/.,/\(^$\|\%$\)/m 0

No entanto, du até a última linha faltando, a primeira entrada não terá uma nova linha depois, então, afinal, pode ser mais fácil simplesmente adicionar uma única linha vazia, adicionar o final e usar o primeiro comando.

    
por 27.07.2016 / 20:53