Pertanyaan Bagaimana cara mengganti karakter dengan baris baru di Vim?


Saya mencoba untuk mengganti masing-masing , dalam file saat ini dengan baris baru:

:%s/,/\n/g 

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

Apa yang harus saya lakukan?

Jika Anda ingin tahu, seperti saya, periksa pertanyaannya Kenapa ada garis baru untuk Vim? demikian juga.


1587
2017-09-16 11:19


asal


Jawaban:


Menggunakan \r dari pada \n.

Digantikan oleh \n menyisipkan karakter null ke dalam teks. Untuk mendapatkan garis baru, gunakan \r. Kapan mencari untuk saluran baru, Anda masih menggunakannya \n, bagaimanapun. Asimetri ini adalah karena fakta itu \n dan \r  melakukan 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 null sedangkan \r menyisipkan baris baru (lebih tepatnya, ini diperlakukan sebagai masukan <CR>). Berikut ini contoh kecil non-interaktif untuk mengilustrasikan 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.


2074
2017-09-16 11:21



Begini caranya:

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

:set magic

Selanjutnya, lakukan:

:s/,/,^M/g

Untuk mendapatkan ^M karakter, tipe Kontrol-v dan tekan Memasukkan. Di bawah Windows, lakukan Kontrol-q, Memasukkan. Satu-satunya cara saya dapat mengingat ini adalah dengan mengingat betapa sedikit rasa yang mereka buat:

SEBUAH: Apa yang akan menjadi karakter kontrol terburuk untuk digunakan untuk mewakili garis baru?

B: Antara q (karena biasanya berarti "Keluar") atau v karena itu akan sangat mudah diketik Kontrol-c dengan kesalahan dan membunuh editor.

SEBUAH: Jadikan demikian.


166
2017-09-25 23:40



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


Untuk foo:
\ n = baris baru
\ r = CR (carriage return = Ctrl-M = ^ M)

Untuk bar:
\ r = adalah baris baru
\ n = bita nol (0x00).


Saya telah melihat pertanyaan tentang hal-hal semacam itu cukup sering di masa lalu, dan kadang-kadang di masa depan hampir tidak ada yang akan tahu apa-apa tentang hal ini pada akhirnya ...

Dengan permintaan 'populer':

Berikut ini adalah daftar Karakter kontrol ASCII, masukkan mereka vim melalui CTRLvCTRL---kunci---.
Di bash atau cangkang unix / linux lainnya cukup ketik CTRL---kunci---. Mencoba CTRLM di bash, itu sama dengan memukul MEMASUKKAN, karena shell menyadari apa yang dimaksud, meskipun sistem linux menggunakan Line Feed untuk pembatas baris. Hanya kontrol char untuk Line Feed CTRL-A, yang terikat untuk 'melompat ke awal baris' di bash.

Untuk memasukkan bash secara harfiah, CTRLv juga akan berfungsi.

Coba di bash:

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

Ini menggunakan Urutan melarikan diri ANSI, masukkan keduanya ^[via CTRLvESC.

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

bash: $'\r': command not found

Ingatlah \r dari atas? :>

Itu Karakter kontrol ASCII daftar berbeda dari standar tabel simbol ascii, dalam karakter kontrol, yang dimasukkan ke konsol / pseudoterminal / vim melalui CTRL kunci (haha), dapat ditemukan di sana. Sedangkan di 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.


65
2017-09-23 14:00



Anda perlu menggunakan

:%s/,/^M/g

Untuk mendapatkan ^M karakter, tekan Ctrl  v diikuti oleh Memasukkan


45
2017-09-16 11:30



\r dapat melakukan pekerjaan di sini untuk Anda.


27
2017-09-16 11:21



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


20
2017-09-16 11:45



Dari gerhana, yang ^M karakter dapat disematkan dalam satu baris, dan Anda ingin mengonversinya menjadi baris baru.

:s/\r/\r/g

8
2017-09-06 17:53



Tetapi jika seseorang harus mengganti maka hal berikut bekerja

:%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 adalah sebagai berikut:

line1
line2
line3

diubah menjadi

line1
|-
line2
|-
line3

5
2018-02-07 08:09



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

Jadi, rewording:

Anda perlu menggunakan \r untuk menggunakan feed baris (ascii 0x0a, newline unix) dalam pengganti regex tetapi itu khusus untuk penggantian - Anda biasanya harus terus berharap untuk menggunakan \n untuk feed baris dan \r untuk pengangkutan kembali.

Ini karena vim digunakan \n sebagai pengganti berarti karakter NIL (ascii 0x00). Anda mungkin mengharapkan NIL telah \0 sebagai gantinya, membebaskan \n untuk penggunaannya yang biasa untuk feed baris, tapi \0 sudah memiliki arti dalam penggantian regex sehingga dialihkan ke \n. Maka kemudian melangkah lebih jauh untuk juga menggeser garis baru dari \n untuk \r (yang dalam pola regex adalah karakter carriage return, ascii 0x0d).

karakter | kode ascii | Representasi C | pertandingan regex | penggantian regex
------------------------- + ------------ + ----------- ------- + ------------- + ------------------------
nil | 0x00 | \ 0 | \ 0 | \ n
line feed (unix newline) | 0x0a | \ n | \ n | r
pengangkutan kembali | 0x0d | \ r | \ r | <unknown>

NB: ^M (Ctrl-V Ctrl-M di linux) menyisipkan baris baru ketika digunakan dalam pengganti regex daripada pengangkutan carriage seperti yang disarankan orang lain (saya baru saja mencobanya).

Perhatikan juga bahwa vim akan menerjemahkan karakter feed baris ketika menyimpan file berdasarkan pengaturan format file dan yang mungkin membingungkan masalah.


5
2018-04-08 12:15



Jika Anda perlu melakukan untuk seluruh file, itu juga menyarankan kepada saya bahwa Anda dapat mencoba dari baris perintah

sed 's/\\n/\n/g' file > newfile

4
2018-02-09 23:01