Bagaimana cara mengganti karakter newline di Vim
I'm mencoba untuk mengganti masing-masing ,
dalam file saat ini oleh baris baru:
:%s/,/\n/g
Tetapi sisipan apa yang tampak seperti ^@
bukan yang sebenarnya newline. File tidak dalam mode DOS atau apa pun.
Apa yang harus saya lakukan?
Jika anda penasaran, seperti saya, memeriksa pertanyaan Mengapa \r newline untuk Vim? juga.
1859
11
Menggunakan
\r
bukan\n
.Mengganti dengan
\n
sisipan null karakter dalam teks. Untuk mendapatkan newline, gunakan\r
. Ketika mencari untuk baris baru, anda masih akan menggunakan\n
, namun. Asimetri ini adalah karena fakta bahwa\n
dan\r
melakukan hal yang sedikit berbeda:\n
pertandingan akhir baris (newline), sedangkan\r
cocok dengan carriage return. Di sisi lain, dalam substitusi\n
sisipan karakter null sedangkan\r
menyisipkan baris baru (lebih tepatnya, itu diperlakukan sebagai input <CR>). Berikut ini kecil, non-interaktif contoh untuk menggambarkan hal ini, menggunakan perintah Vim fitur garis (dalam kata lain, anda dapat copy dan paste kode berikut ke dalam terminal untuk menjalankannya).xxd
menunjukkan hexdump file yang dihasilkan.Dengan kata lain,
\n
telah dimasukkan byte 0x00 ke dalam teks;\r
telah dimasukkan byte 0x0a.Berikut ini's triknya:
Pertama, mengatur vi(m) sesi untuk memungkinkan pencocokan pola dengan karakter khusus (ie: newline). It's mungkin layak menempatkan baris ini pada anda .vimrc atau .exrc file.
Berikutnya, lakukan:
Untuk mendapatkan
^M
karakter, jenis Control-v dan hit Enter. Di bawah Windows, lakukan Control-q, Enter. Satu-satunya cara yang bisa saya ingat ini adalah dengan mengingat betapa sedikit rasa yang mereka buat:Dalam sintaks
s/foo/bar
\r
dan\n
memiliki makna yang berbeda, tergantung pada konteks.pendek:
Untuk
foo
:\n = newline (LF pada linux/mac, CRLF pada windows)
\r = carriage return (CR)
Untuk
bar
:\r = merupakan newline
\n = null byte.
lagi: (dengan ascii angka)
`NULL` = 0x00 = 0 = PILIH@`JIKA` = 0x0A = 10 = PILIHJ
`CR` = 0x0D = 13 = PILIHM
Berikut adalah daftar dari ASCII karakter kontrol, memasukkan mereka dalam
vim
via CTRLvCTRL---key---.Di
bash
atau yang lain unix/linux kerang hanya jenis PILIH---penting---. Mencoba PILIHM di bash, yang sama seperti memukul ENTER, seperti shell menyadari apa yang dimaksud, meskipun sistem linux menggunakan Line Feed untuk line pembatasan.Untuk menyisipkan literal's di bash, mereka mengawali dengan PILIHv juga akan bekerja.
Coba di bash:
Ini menggunakan ANSI escape sequences, menyisipkan dua
^[
's melalui PILIHvSPASI.Anda mungkin juga mencoba CTRLvCTRLmENTER, yang akan memberikan anda ini:
Ingat
\r
dari atas? :>Ini ASCII karakter kontrol daftar ini berbeda dari yang lengkap simbol ASCII table, bahwa karakter kontrol, yang dimasukkan ke konsol/pseudoterminal/vim melalui PILIH kunci (haha), dapat ditemukan di sana. Sedangkan di C dan kebanyakan bahasa lain, anda biasanya menggunakan kode oktal untuk mewakili ini 'karakter'.
Jika anda benar-benar ingin tahu di mana semua ini berasal dari: http://www.linusakesson.net/programming/tty/.
Ini adalah yang terbaik link anda akan menemukan tentang topik ini, tapi hati-hati: Ada naga.
TL;DR
Biasanya
foo
=\n
, danbar
=\r
.Anda perlu menggunakan
Untuk mendapatkan
^M
karakter, tekan Pilih v diikuti oleh Enter\r
dapat melakukan pekerjaan di sini untuk anda.Dengan Vim pada Windows menggunakan Pilih+Q tempat Pilih+V
Ini adalah jawaban terbaik untuk cara berpikir saya tapi itu akan menjadi lebih baik dalam sebuah tabel: https://stackoverflow.com/a/12389839/962394.
Jadi, rewording:
Anda perlu menggunakan
\r
untuk menggunakan line feed (ascii0x0a
, unix newline) di regex pengganti tapi yang aneh untuk penggantian - anda biasanya harus terus berharap untuk menggunakan\n
untuk line feed dan\r
untuk carriage return.Hal ini karena vim digunakan
\n
dalam penggantian berarti NIHIL karakter (ascii0x00
). Anda mungkin telah diharapkan NIL telah\0
sebaliknya, membebaskan\n
untuk yang biasa digunakan untuk line feed, tapi\0
sudah memiliki makna dalam regex pengganti jadi itu bergeser ke\n
. Oleh karena itu maka akan lebih untuk juga menggeser baris baru dari\n
untuk\r
(yang dalam pola regex adalah karakter carriage return, ascii0x0d
).NB:
^M
(Ctrl-V, Ctrl-M di linux) untuk menyisipkan baris baru ketika digunakan pada regex pengganti daripada kereta kembali sebagai orang lain telah disarankan (saya hanya mencoba).Juga perhatikan bahwa vim akan menerjemahkan line feed karakter ketika ia menyimpan ke file berdasarkan format file dan pengaturan yang mungkin membingungkan masalah.
Dari eclipse,
^M
karakter yang dapat ditanamkan dalam satu baris, dan anda ingin mengkonversi mereka ke baris baru.Tapi jika salah satu telah untuk pengganti maka berikut ini hal bekerja
di atas setiap baris berikutnya diganti dengan baris berikutnya dan kemudian |- dan lagi baris berikutnya. Ini adalah yang digunakan di wiki tabel. jika teks adalah sebagai berikut:
berubah untuk
Jika yang perlu anda lakukan untuk seluruh berkas, ia juga menyarankan untuk saya yang bisa anda coba dari command line
Heres jawaban yang bekerja untuk saya. Dari orang ini
----mengutip http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/
Hal lain yang saya harus lakukan dan tidak ingat dan kemudian harus melihat ke atas.
Di vi untuk menyisipkan karakter newline dalam pencarian dan mengganti, lakukan hal berikut:
:%s/look_for/replace_with^M/g perintah di atas akan mengganti semua contoh dari "look_for" dengan "replace_with\n" (dengan \n arti newline)
untuk mendapatkan "^M", masukkan kombinasi tombol "ctl-V" kemudian setelah itu (melepaskan semua kunci) tekan "enter".