it-swarm-id.com

Bagaimana cara mengganti karakter dengan baris baru di Vim

Saya mencoba mengganti setiap , dalam file saat ini dengan baris baru:

:%s/,/\n/g 

Tapi itu memasukkan apa yang tampak seperti ^@ bukan baris baru yang sebenarnya. File tidak dalam mode DOS atau apa pun.

Apa yang harus saya lakukan?

Jika Anda penasaran, seperti saya, periksa pertanyaanMengapa baris baru untuk Vim?juga.

1755
Vinko Vrsalovic

Gunakan \r alih-alih \n.

Mengganti dengan \n memasukkan karakter nol ke dalam teks. Untuk mendapatkan baris baru, gunakan \r. Saat mencari untuk baris baru, Anda masih menggunakan \n. Asimetri ini disebabkan oleh fakta bahwa \n dan \rmelakukan hal-hal yang sedikit berbeda :

\n cocok dengan akhir baris (baris baru), sedangkan \r cocok dengan carriage return. Di sisi lain, dalam substitusi \n menyisipkan karakter nol sedangkan \r menyisipkan baris baru (lebih tepatnya, itu diperlakukan sebagai input <CR>). Berikut ini adalah contoh kecil, non-interaktif untuk menggambarkan hal ini, menggunakan fitur baris perintah Vim (dengan kata lain, Anda dapat menyalin dan menempel berikut ini ke terminal untuk menjalankannya). xxd menunjukkan hexdump dari 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 memasukkan byte 0x00 ke dalam teks; \r telah memasukkan byte 0x0a.

2317
Konrad Rudolph

Inilah triknya:

Pertama, atur sesi vi (m) Anda untuk memungkinkan pencocokan pola dengan karakter khusus (yaitu: baris baru). Mungkin layak menempatkan baris ini di file .vimrc atau .exrc Anda.

:set magic

Selanjutnya, lakukan:

:s/,/,^M/g

Untuk mendapatkan karakter ^M, ketik Control-v dan tekan Enter. Di bawah Windows, lakukan Control-qEnter. Satu-satunya cara saya dapat mengingat ini adalah dengan mengingat betapa sedikitnya pengertian mereka:

A: Apa yang akan menjadi karakter kontrol terburuk yang digunakan untuk mewakili baris baru?

B: Entah q (karena biasanya berarti "Berhenti") atau v karena akan sangat mudah untuk mengetik Control-c karena kesalahan dan bunuh editor.

A: Jadikan begitu.

184
Logan

Dalam sintaksis s/foo/bar\r dan \n memiliki arti yang berbeda, tergantung konteksnya.


pendek:

Untuk foo:
\n = baris baru (LF di linux/mac, CRLF di windows)
\r = carriage return (CR)

Untuk bar:
\r = adalah baris baru
\n = byte nol.

lebih lama: (dengan nomor ascii)

NUL = 0x00 = 0 = CTRL@
LF = 0x0A = 10 = CTRLJ
CR = 0x0D = 13 = CTRLM

Berikut adalah daftar karakter kontrol ASCII , masukkan dalam vim via CTRLvCTRL---key---.
Di bash atau shell unix/linux lainnya cukup ketik CTRL---key---. Mencoba CTRLM di bash, sama seperti memukul ENTER, ketika Shell menyadari apa yang dimaksud, meskipun sistem linux menggunakan Umpan Garis untuk pembatasan garis.

Untuk memasukkan literal di bash, tambahkan dengan CTRLv juga akan bekerja.

Coba di bash:

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

Ini menggunakan ANSI escape sequence , masukkan dua ^[ melalui CTRLvESC.

Anda mungkin juga mencoba CTRLvCTRLmENTER, yang akan memberi Anda ini:

bash: $'\r': command not found

Ingat \r dari atas? :>

Daftar karakter kontrol ASCII ini berbeda dari tabel simbol ASCII yang lengkap , di mana karakter kontrol, yang dimasukkan ke konsol/pseudoterminal/vim via CTRL kunci (haha), dapat ditemukan di sana. Sedangkan dalam C dan sebagian besar bahasa lain Anda biasanya menggunakan kode oktal untuk mewakili 'karakter' ini.

Jika Anda benar-benar ingin tahu dari mana semua ini berasal: http://www.linusakesson.net/programming/tty/ .
Ini adalah tautan terbaik yang akan Anda temui tentang topik ini, tetapi berhati-hatilah: Ada naga.


TL; DR

Biasanya foo = \n, dan bar = \r.

84
sjas

Anda harus menggunakan

:%s/,/^M/g

Untuk mendapatkan karakter ^M, tekan Ctrlv diikuti oleh Enter

50
dogbane

\r dapat melakukan pekerjaan di sini untuk Anda.

33
Lasar

Dengan Vim pada penggunaan Windows Ctrl+Q di tempat Ctrl+V

22
grantc

Ini adalah jawaban terbaik untuk cara saya berpikir tetapi akan lebih baik dalam tabel: https://stackoverflow.com/a/12389839/962394 .

Jadi, menulis ulang:

Anda perlu menggunakan \r untuk menggunakan umpan baris (ascii 0x0a, unix newline) dalam penggantian regex tetapi yang khusus untuk penggantian - Anda biasanya harus terus menggunakan \n untuk umpan baris dan \r untuk carriage return.

Ini karena vim menggunakan \n sebagai pengganti berarti karakter NIL (ascii 0x00). Anda mungkin mengharapkan NIL menjadi \0 sebagai gantinya, membebaskan \n untuk penggunaan biasa untuk umpan baris, tetapi \0 sudah memiliki arti dalam penggantian regex sehingga dialihkan ke \n. Oleh karena itu kemudian melangkah lebih jauh dengan menggeser baris baru dari \n ke \r (yang dalam pola regex adalah karakter carriage return, ascii 0x0d).

 karakter | kode ascii | Representasi C | pertandingan regex | penggantian regex 
 ------------------------- + ------------ + ---- -------------- + ------------- + --------------------- --- 
 nihil | 0x00 |\0 |\0 |\n 
 umpan baris (hapus baris baru) | 0x0a |\n |\n | carriage return | .r 0x0d |\r |\r | <unknown> 

NB: ^M (Ctrl-V Ctrl-M di linux) menyisipkan baris baru saat digunakan dalam penggantian regex daripada carriage return seperti yang disarankan orang lain (saya baru mencobanya).

Perhatikan juga bahwa vim akan menerjemahkan karakter umpan baris ketika menyimpan ke file berdasarkan pengaturan format file dan itu mungkin membingungkan hal-hal.

10
codeshot

Dari Eclipse, karakter ^M dapat disematkan dalam satu baris, dan Anda ingin mengubahnya menjadi baris baru.

:s/\r/\r/g
10
rickfoosusa

Tetapi jika seseorang harus menggantinya maka hal berikut berfungsi

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

di atas setiap baris berikutnya diganti dengan baris berikutnya dan kemudian - dan lagi baris berikutnya. Ini digunakan dalam tabel wiki. jika teksnya sebagai berikut:

line1
line2
line3

diubah menjadi

line1
|-
line2
|-
line3
7

Jika Anda perlu melakukannya untuk seluruh file, disarankan juga kepada saya bahwa Anda dapat mencoba dari baris perintah

sed 's/\\n/\n/g' file > newfile
6
Evan Donovan

Inilah jawaban yang bekerja untuk saya. Dari pria ini

---- mengutip http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


Hal lain yang harus saya lakukan dan tidak dapat mengingat dan kemudian harus melihat ke atas.

Dalam vi untuk menyisipkan karakter baris baru dalam pencarian dan ganti, lakukan hal berikut:

:% s/look_for/replace_with ^ M/g perintah di atas akan menggantikan semua instance "look_for" dengan "replace_with\n" (dengan\n yang berarti baris baru)

untuk mendapatkan "^ M", masukkan kombinasi tombol "ctl-V" lalu setelah itu (lepaskan semua kunci) tekan tombol "enter".


4
user407749