Gabungkan garis antara pola teks tertentu di Vim

8

Saya memiliki file teks yang terlihat seperti ini:

A.
text
text
text


A.
more text

more text

A.
more text

Saya ingin menggabungkan semua garis di antara "marker" A.sehingga terlihat seperti:

A.texttexttext
A.more textmore text
A.more text

Bagaimana saya bisa melakukan ini di Vim?

vim noob
sumber

Jawaban:

4
:%s/\n\(\(A\.$\)\@!.*\)/\1/

Mengganti pencocokan pola:

  1. garis baru,
  2. grup yang berisi

    1. bukan string yang A.langsung diikuti oleh end-of-line, lalu
    2. karakter apa saja hingga akhir baris

dengan:

  • semuanya cocok kecuali baris awal (yaitu grup di atas),

dan lakukan ini secara global.

Daniel Andersson
sumber
1
Terima kasih. Saya tidak tahu bagaimana hal itu bekerja, tetapi tampaknya! Saya harus membedahnya dengan hati-hati. Saya juga menemukan pekerjaan dengan menggabungkan semua baris dan kemudian memasukkan baris baru pada "A."
vim noob
@vimnoob: Lihat :help \@!di Vim untuk info lebih lanjut tentang bagian itu. Kalau tidak langsung, mudah-mudahan, dengan penjelasan saya. Masalah dengan pendekatan Anda adalah jika " A." muncul dalam teks, meskipun bukan sebagai garis penanda yang terisolasi, "" itu akan dipecah menjadi seolah-olah itu awalnya penanda. Dalam praktiknya ini mungkin bukan masalah (saya tidak tahu seperti apa file "asli" Anda), tetapi secara umum dapat menyebabkan perilaku yang tidak diinginkan jika seseorang tidak mengetahui hal ini.
Daniel Andersson
@ vimnoob: Saya membaca jawaban saya lagi, dan jika Anda tidak terbiasa dengan :%s///sintaks: ini adalah sintaks "cari dan ganti" di Vim. :memulai perintah, %menentukan seluruh buffer sebagai kisaran, smemulai substitusi. /adalah pembatas pola (setiap karakter lain dapat digunakan, tetapi /"standar"). Yang pertama /memulai pola pencarian, yang kedua adalah pola ganti, dan yang ketiga mengakhirinya. Pengubah jejak tersedia untuk menentukan ketidakpekaan huruf, dll. \1Mewakili kelompok yang diraih dalam pola pencarian. :%s/foo/bar/menggantikan foodengan bardalam file.
Daniel Andersson
Terima kasih banyak atas bantuan Anda. Saya hanya perlu meneliti ini \ @! bagian seperti saya akrab dengan ganti pencarian dasar dan regexp dasar.
vim noob
1
@Reman: Cara paling mudah yang segera saya pikirkan adalah menjalankan pencocokan pola global berikutnya seperti :%s/^A\.//. Metode dalam jawaban tidak menangkap ^A\.pola itu sendiri (bukan ketidakhadiran mereka), sehingga tidak dapat memodifikasi string tersebut dengan cara yang jelas.
Daniel Andersson
7

Ini juga berfungsi (ketika baris pertama dimulai dengan A.)

:v/^A/-1j!
Miro
sumber
Itu berhasil! Bagus. +1
ZaSter
Yay, sesungguhnya, dan dua trik baru bagi saya, setelah pertandingan anti-pola global (v): 'j' untuk bergabung, dan '!' untuk bergabung tanpa menambahkan spasi. Terima kasih.
fortboise
@Miro wow! Saya salut kepada Anda, Tuan. jika Anda bisa menjelaskan mengapa ini bekerja maka super! .. juga saya harus menyatukan baris dengan karakter tab di antara ... jadi apa yang saya lakukan adalah menambahkan / tab / $ / \ / g karakter di akhir setiap baris sebelum mengeluarkan perintah di atas .. cara yang lebih baik
ihightower