¿Cómo invierto el orden de las entradas de registro en este archivo? (Vim por preferencia)


0

Tengo un conjunto de archivos que contienen notas escritas en orden inverso:

###### 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

Me gustaría que aparezcan en este orden:

###### 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? 

Algunos de estos archivos tienen un par de cientos de entradas: ¿cuál es la forma más fácil de hacer que esto suceda?


El comando linux 'tac' (palabras clave 'cat') imprimirá todas las líneas invertidas pero luego sus grupos también se invertirán. (Mensaje después de la fecha)
P. Heffner

Respuestas:


3

Solo tac

El comando tacpuede hacerlo.

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

Call tac by Vim

Si quieres ejecutarlo en Vim:

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

% significa todas las líneas.

!corre comando externo .

La barra invertida es necesaria para escapar del inicio #de sesión con el número "\#\#\#\#\#\#".

Solo vim

Estos comandos reemplazan la nueva línea por tabulación. Si la pestaña está presente en el registro, use otro carácter en lugar de la pestaña.

:%s/\n/\t/g
:%s/\t######/\r######/g
:g/^/m0
:%s/\t/\r/g

1

Si hay una nueva línea final al final, el siguiente comando hace lo que desea en Vim:

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

La búsqueda de líneas que comienzan con ###toma el rango de ###hasta la siguiente línea en blanco y la mueve a la parte superior.

Si no hay una nueva línea final, probablemente abortará con E16: invalid range, por ejemplo , en ese caso, podría ajustar la expresión regular de esta manera:

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

Sin embargo, a falta de la última línea, la primera entrada no tendrá una nueva línea después, por lo que, después de todo, podría ser más fácil agregar una sola línea vacía, agregar el final y usar el primer comando.


¿Es posible que el rango vaya a otro ######, algo así :g/^###/,/^###/-1m 0? ¿Cuál es el propósito del punto .en su código?
Marco

:g/^###/;/\(\n###\|\%$\)/m0trabajó para mi.
Marco

el punto significa explícita esta línea . Sí, puede cambiar el patrón para que coincida con otras líneas si lo desea
Christian Brabandt
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.