Mengapa newline untuk Vim?

254

Dari pertanyaan Bagaimana cara mengganti karakter untuk baris baru di Vim? . Anda harus menggunakan \ r saat mengganti teks untuk baris baru, seperti ini

:%s/%/\r/g

Tetapi ketika mengganti akhir baris dan baris baru untuk karakter, Anda dapat melakukannya seperti:

:%s/\n/%/g 

Bagian mana dari manual yang mendokumentasikan perilaku ini, dan apa alasan di baliknya?

Vinko Vrsalovic
sumber
1
Apa %gunanya saat mencari dan mengganti?
qed
7
@qed: secara default :shanya akan menerapkan substitusi ke baris saat ini. :%smembuatnya mengatasi seluruh file. Lebih banyak .
c24w
3
+ c24w Saya pikir dia mengacu pada '%' antara garis miring, contoh pertama '%' berada di lokasi pencarian, dan di lokasi ganti dalam contoh kedua, tetapi @qed untuk menjawab pertanyaan Anda, itu% Dicocokkan secara harfiah.
RastaJedi

Jawaban:

155

Dari dokumen vim pada pola :

\r cocok dengan <CR>

\n cocok dengan end-of-line - Saat mencocokkan dalam string dan bukan teks buffer karakter baris baru literal cocok.

pjz
sumber
41
Bagi saya titik kebingungannya adalah bahwa \ r dan \ n memiliki arti yang berbeda ketika digunakan adalah pola pencarian dan pola penggantian.
dlamblin
3
@dlamblin Yup! Lihat jawaban saya :)
Penebusan Terbatas
207

Dari http://vim.wikia.com/wiki/Search_and_replace :

Saat Mencari

...

\nadalah baris baru, \radalah CR(carriage return = Ctrl-M= ^M)

Saat Mengganti

...

\radalah baris baru, \nadalah byte nol ( 0x00).

Kurban Tebusan Terbatas
sumber
6
Jawaban ini sangat membantu saya. Juga, untuk informasi lebih lanjut :h :s%, terutama paragraf terakhir. (via :h :s)
dipnlik
114

Aspek lain untuk ini adalah bahwa \0, yang secara tradisional NULL, dianggap s//\0/berarti "pola yang cocok secara keseluruhan". (Yang, omong-omong, berlebihan dengan, dan lebih lama dari, &).

  • Jadi Anda tidak bisa menggunakan \0maksud NULL, jadi Anda gunakan\n
  • Jadi Anda tidak bisa menggunakan \nmaksud \n, jadi Anda gunakan \r.
  • Jadi Anda tidak bisa menggunakan \rmaksud \r, tapi saya tidak tahu siapa yang ingin menambahkan char itu dengan sengaja.

—☈

rking
sumber
1
Poin bagus! Jadi ini adalah retas sekitar \ 0 - referensi ke grup bersarang ke-0 - seluruh regexp. Ini adalah jawaban yang sangat bagus, tetapi itu membuat saya kecewa, bahwa saya tidak dapat menggunakan pengganti ... (artinya: masukkan # (13), misalnya dalam file "normal" (== unix EOLs).
Tomasz Gandor
3
OK, jawabannya ada di Vim docs. Cukup lepas \ ^ M atau \ <CR>, dengan garis miring terbalik yang normal. Bagus. ----- <CR> pisahkan baris menjadi dua pada titik ini (Ketikkan <CR> sebagai CTRL-V <Enter>) s <CR> \ r idem -------- s / \ r \ < CR> masukkan carriage-return (CTRL-M) (Ketikkan <CR> sebagai CTRL-V <Enter>) s / \ <CR>
Tomasz Gandor
16
"Aspek lain"? Kamu terlalu rendah hati! Menjelaskan dengan tepat saat ini terjadi membuat jawaban yang lebih baik untuk semua yang hanya mengatakan bagaimana cara mengatasinya. +1
underscore_d
Jujur ini benar- benar wawasan hebat mengapa \nmemiliki arti yang berbeda dalam mencari dan mengganti pola. Jawaban yang fantastis.
ZeroKnight
47

:help NL-used-for-Nul

Detail teknis:

<Nul>karakter dalam file disimpan <NL>dalam memori. Di layar mereka ditampilkan sebagai " ^@". Terjemahan dilakukan ketika membaca dan menulis file. Untuk mencocokkan <Nul>dengan pola pencarian Anda cukup memasukkan CTRL- @ atau " CTRL-V 000". Ini mungkin hanya apa yang Anda harapkan. Secara internal karakter diganti dengan <NL>dalam pola pencarian. Apa yang tidak biasa adalah mengetik CTRL-V CTRL-J juga menyisipkan <NL>, dengan demikian juga mencari <Nul> di dalam file. {Vi tidak bisa menangani <Nul>karakter dalam file sama sekali}


Aristoteles Pagaltzis
sumber
10

Pertama-tama, buka :h :suntuk melihat bagian "4.2 Pengganti" dokumentasi tentang "Ubah". Inilah yang diterima perintah:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

Perhatikan deskripsi tentang patterndanstring

Untuk {pattern}tahta |pattern|.
{string}dapat berupa string literal, atau sesuatu yang
istimewa; lihat |sub-replace-special|.

Jadi sekarang Anda tahu bahwa pola pencarian dan pola penggantian mengikuti aturan yang berbeda. Jika Anda mengikuti tautan |pattern|, itu akan membawa Anda ke bagian yang menjelaskan seluruh pola regexp yang digunakan di Vim.

Sementara itu, |sub-replace-special|membawa Anda ke subbagian "4.2 Substitute", yang berisi pola-pola substitusi, di antaranya adalah \runtuk line break / split.

(Cara pintas ke bagian manual ini adalah :h :s%)

Syockit
sumber