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.

Mengomentari pertanyaan (3)
Larutan

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.

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

Dengan kata lain, \n telah dimasukkan byte 0x00 ke dalam teks; \r telah dimasukkan byte 0x0a.

Komentar (16)

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.

:set magic

Berikutnya, lakukan:

:s/,/,^M/g

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:

A: What akan menjadi yang terburuk kontrol-karakter yang digunakan untuk mewakili sebuah baris baru?

B: Either q (karena itu biasanya berarti "Berhenti") atau v karena itu akan menjadi begitu mudah untuk mengetik Control-c oleh kesalahan dan membunuh editor.

A: Make begitu.

Komentar (5)

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:

echo ^[[33;1mcolored.^[[0mnot colored.

Ini menggunakan ANSI escape sequences, menyisipkan dua ^['s melalui PILIHvSPASI.

Anda mungkin juga mencoba CTRLvCTRLmENTER, yang akan memberikan anda ini:

bash: $'\r': command not found

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, dan bar = \r.

Komentar (4)

Anda perlu menggunakan

:%s/,/^M/g

Untuk mendapatkan ^M karakter, tekan Pilih v diikuti oleh Enter

Komentar (1)

\r dapat melakukan pekerjaan di sini untuk anda.

Komentar (0)

Dengan Vim pada Windows menggunakan Pilih+Q tempat Pilih+V

Komentar (0)

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 (ascii 0x0a, 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 (ascii 0x00). 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, ascii 0x0d).

karakter | kode ascii | C representasi | regex pertandingan | regex pengganti
-------------------------+------------+------------------+-------------+------------------------
nihil | 0x00 | \0 | \0 | \n
line feed (unix newline) | 0x0a | \n | \n | \r
carriage return | 0x0d | \r | \r | <unknown>

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.

Komentar (0)

Dari eclipse, ^M karakter yang dapat ditanamkan dalam satu baris, dan anda ingin mengkonversi mereka ke baris baru.

:s/\r/\r/g
Komentar (0)

Tapi jika salah satu telah untuk pengganti maka berikut ini hal bekerja

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

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:

line1
line2
line3

berubah untuk

line1
|-
line2
|-
line3
Komentar (0)

Jika yang perlu anda lakukan untuk seluruh berkas, ia juga menyarankan untuk saya yang bisa anda coba dari command line

sed 's/\\n/\n/g' file > newfile
Komentar (1)

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".


Komentar (0)