Bagaimana cara membalik urutan entri log dalam file ini? (Vim untuk preferensi)

0

Saya punya satu set file yang berisi catatan yang ditulis dalam urutan terbalik:

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

Saya ingin mereka tampil dalam urutan ini:

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

Beberapa file ini memiliki beberapa ratus entri - apa cara termudah untuk mewujudkannya?

Joe
sumber
Perintah linux 'tac' ('cat' backwords) akan mencetak semua baris yang dibalik tetapi kemudian grup Anda akan dibalik juga. (Pesan setelah tanggal)
P. Heffner

Jawaban:

3

Hanya tac

Perintah tacdapat melakukannya.

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

Panggil tac oleh Vim

Jika Anda ingin menjalankannya di Vim:

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

% berarti semua baris.

!menjalankan perintah eksternal .

Backslash perlu untuk melarikan diri dari tanda nomor #di "\#\#\#\#\#\#".

Hanya Vim

Perintah-perintah ini menggantikan baris baru dengan tab. Jika tab ada di log, gunakan karakter lain sebagai ganti tab.

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

Jika ada baris baru akhir di akhir, perintah berikut melakukan apa yang Anda inginkan di Vim:

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

Pencarian baris yang dimulai dengan ###mengambil rentang dari ###hingga baris kosong berikutnya dan memindahkannya ke atas.

Jika tidak ada baris baru final, itu mungkin akan dibatalkan dengan misalnya E16: invalid range, dalam hal ini Anda dapat menyesuaikan regex seperti ini:

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

Namun, du ke baris terakhir yang hilang, entri pertama tidak akan memiliki baris baru sesudahnya, jadi setelah semua itu mungkin lebih mudah untuk hanya menambahkan satu baris kosong, tambahkan akhir dan gunakan perintah pertama.

Christian Brabandt
sumber
Mungkin rentang untuk pergi ke yang lain ######, seperti :g/^###/,/^###/-1m 0? Apa tujuan dari titik .dalam kode Anda?
Marco
:g/^###/;/\(\n###\|\%$\)/m0bekerja untukku.
Marco
titik berarti secara eksplisit baris ini . Ya, Anda dapat mengubah pola untuk mencocokkan garis lain jika Anda mau
Christian Brabandt