Vim - cara mengganti satu baris baru \ n dengan dua \ n's

34

Dalam editor vim, saya ingin mengganti karakter baris baru (\ n) dengan dua karakter baris baru (\ n \ n) menggunakan mode perintah vim.

Masukkan konten file:

This is my first line.
This is second line.

Perintah yang saya coba:

:%s/\n/\n\n/g

itu menggantikan string dengan karakter yang tidak diinginkan sebagai

This is my first line.^@^@This is second line.^@^@

Kemudian saya mencoba perintah berikut

:%s/\n/\r\r/g

Ini berfungsi dengan baik. Bisakah Anda menjelaskan mengapa itu berfungsi dengan baik dengan perintah kedua?

Raghvendra
sumber
Lihat juga unix.stackexchange.com/a/206404
Stéphane Chazelas
2
FYI: Ada juga SE Vi dan Vim (beta) .
Dubu
2
Catatan, Anda tidak harus menggunakan /sebagai pemisah. Ini lebih mudah dibaca::%s;\n;\n\n;g
DJMcMayhem
1
Mencari \n, ganti dengan \r\r, :% s/\n/\r\r/g: stackoverflow.com/a/71334/911945
Anton Tarasenko

Jawaban:

47

Anehnya, \ndalam vim untuk penggantian tidak berarti baris baru, tetapi nol. Nomor ASCII adalah ^@( control@).

Secara historis, vi menggantikan ^M( controlM) sebagai akhiran baris, yang merupakan baris baru. vim menambahkan ekstensi \r(seperti bahasa C) yang berarti sama dengan ^M, tetapi pengembang memilih untuk membuat \nnol berarti ketika mengganti teks. Ini tidak konsisten dengan penggunaannya dalam pencarian , yang menemukan baris baru.

Bacaan lebih lanjut:

Thomas Dickey
sumber
7

Coba ini: %s/$/^V^M/(di mana ^Vada Ctrl-Vdan ^Madalah Ctrl-M- ketika Anda mengetiknya ^Vakan mencetak ^char kemudian mundur ruang di atasnya dan kemudian ketika Anda mengetiknya ^Makan muncul sebagai ^M... Ctrl-V adalah karakter standar tty literal berikutnya - jalankan perintah stty -auntuk tunjukkan karakter spesial tty Anda).

Murray Jensen
sumber
Memang, yang sangat berpengalaman akan mengetahui hal ini untuk konversi yang diperlukan dari CRLF sebagai alternatif untuk keluar dan menggunakan dos2unix atau yang serupa. Penggunaan Ctrl-V adalah pelajaran 1 hari vi.
mckenzm
5

vimgunakan \nuntuk mewakili karakter null \0dalam memori, yang bagaimana vimmenangani file berisi karakter null (sementaravi tidak bisa).

Penggunaan \n hanya cocokkan ujung garis dalam buffer, bukan baris baru di string saat menggunakan dalam ekspresi.

Lihat : h NL-used-for-Null dan : h CR-used-for-NL untuk detail lebih lanjut.

cuonglm
sumber
1

Diuji dengan Neovim ( nvim) dan Vimversi

NVIM v0.3.0
VIM - Vi IMproved 8.1

Hapus baris baru:

cell
allele
rs2981578
fgfr2

Di sini, \ncocok dengan baris baru (untuk memasukkan baris baru, gunakan \r):

:'<,'>s/\n/|/g

cell|allele|rs2981578|fgfr2

Tambahkan baris baru:

Nggak:

cell|allele|rs2981578|fgfr2

:'<,'>s/\n/|/g

cell^@allele^@rs2981578^@fgfr2

^@adalah tanda diakritik untuk LF (umpan baris; lihat http://vimhelp.appspot.com/digraph.txt.html#digraphs-default )

Iya nih:

cell|allele|rs2981578|fgfr2

:'<,'>s/|/\r/g

cell
allele
rs2981578
fgfr2

Untuk menjawab pertanyaan OP (bagaimana cara mengganti satu \ndengan dua, \n\n), cukup tambahkan yang lain \r:

cell
allele
rs2981578
fgfr2

:'<,'>s/\n/\r\r/g

cell

allele

rs2981578

fgfr2

... yaitu, cocokkan dengan baris baru asli ( \n), dan ganti dengan dua baris baru / carriage return ( \r\r).

Victoria Stuart
sumber