Apakah mungkin untuk mengonversi teks yang dalam bentuk changelog dari yang terlama menjadi yang terbaru yang pertama, menggunakan vim?

0

Apakah mungkin untuk mengonversi teks yang berbentuk changelog menjadi terbaru-pertama, menggunakan vim?

Seperti ini:

version 1.0

multi_line description for 1.0


version 1.01

multi_line description for 1.01

etc

dan saya ingin mengubahnya menjadi

version 1.90

multi_line description for 1.90


version 1.89

multi_line description for 1.89

etc

Teksnya terlalu panjang untuk mengubahnya secara manual.

PS. "deskripsi multi_line" misalnya:

Added feature x
Fixed bug y
Removed element z
Updated file z
darkred
sumber

Jawaban:

1

Saya berasumsi Anda hanya ingin membalik urutan, bukan mengurutkan ulang.

Ini berfungsi dalam tes kecil saya:

:g/^version/,/\nversion\|\%$/m0

Ini mengasumsikan bahwa setiap baris yang dimulai dengan "versi" adalah awal dari bagian yang ingin Anda pertahankan. Cara yang lebih sederhana untuk melakukannya adalah dengan menambahkan baris dummy yang hanya berisi "versi" di akhir file, lalu

:g/^version/,//-m0

abaikan pesan kesalahan, dan hapus garis dummy.

Either way, ini memberitahu vim untuk mengeksekusi [range]m0 pada setiap baris yang cocok ^version. Perintah m0 atau :move 0 memindahkan garis yang ditunjukkan ke awal file.

Di versi kedua, rentang berjalan dari baris saat ini (yang cocok ^version ) ke baris yang cocok berikutnya, minus 1. Jika Anda dapat menyimpan dua karakter tambahan, tambahkan titik dan 1: .,//-1 setara dengan ,//-.

Versi pertama yang saya berikan kepada koki memberikan pola yang lebih kompleks untuk menghadapi kenyataan bahwa, pada pertandingan terakhir, pencarian untuk pertandingan berikutnya akan gagal. Dalam pola vim, \%$ mengacu pada baris terakhir atau EOF.

benjifisher
sumber
Versi 1 berfungsi seperti pesona. Terima kasih banyak atas bantuannya!
darkred