Bagaimana cara mengubah linebreak ^ M ke linebreak 'normal' dalam file yang dibuka di vim?


481

vim menunjukkan pada setiap baris yang berakhir ^ M

Bagaimana cara saya mengganti ini dengan linebreak 'normal'?



3
Silakan ubah solusi untuk perubahan format file karena itu solusi paling bersih.
erikbwork

1
Saya tahu pertanyaan ini tentang vim, tetapi beberapa pencarian Google lainnya juga mendarat di utas ini. Jadi, jika Anda menginstal Eclipse di sistem Anda, Anda dapat mengonversi pemisah baris untuk satu file atau folder lengkap file dengan beberapa klik: stackoverflow.com/a/7019737/1364747
Teddy

Saya suka bagaimana Anda memanggil jeda baris normal "normal" - berbeda dengan jeda baris ^ M :-)
DerMike

Jawaban:



577

Perintah

:%s/<Ctrl-V><Ctrl-M>/\r/g

Dimana <Ctrl-V><Ctrl-M>artinya ketik Ctrl+ Vlalu Ctrl+ M.

Penjelasan

:%s

pengganti,% = semua baris

<Ctrl-V><Ctrl-M>

^ M karakter (Ctrl-V adalah cara Vim menulis karakter Ctrl ^ dan Ctrl-M menulis M setelah ekspresi reguler, menghasilkan ^ M karakter khusus)

/\r/

dengan baris baru (\r )

g

Dan lakukan secara global (bukan hanya kejadian pertama di telepon).


21
itu menghapus karakter ^ M tetapi tidak memasukkan carriage return.
luckytaxi

14
@ jumpnett - Anda perlu menekan akor tombol Ctrl-V / Ctrl-M, bukan memasukkannya sebagai teks kata demi kata.
LeopardSkinPillBoxHat

33
Ini jelas merupakan jawaban yang tepat untuk pertanyaan, jika Anda memiliki ^ M diikuti oleh baris baru, Anda ingin mempertahankan baris baru tetapi menghapus ^ M. Melakukan subtitusi lain di bawah menggandakan ruang file Anda.
dlamblin

12
Jika Anda masih kehilangan carriage return (yaitu ^ M telah dihapus tetapi semuanya dibungkus dalam satu baris), lakukan: :%s/<Ctrl-V><Ctrl-M>/\r/g(di mana ^ r mengganti ^ M dengan baris baru).
William Turrell

7
Jika Anda menjalankan Vim di Windows, maka Anda harus menggunakan <Ctrl-Q> alih-alih <Ctrl-V>.
GrandAdmiral

418

Di Linux dan Mac OS, berikut ini berfungsi,

:%s/^V^M/^V^M/g

di mana ^V^Martinya ketik Ctrl+ V, lalu Ctrl+M .

Catatan: pada Windows Anda mungkin ingin menggunakan ^Qbukan ^V, karena secara default ^Vdipetakan untuk menempelkan teks.


3
Mengapa ini mendapat downvote? Berhasil, bahkan ketika file Anda dihaluskan ke satu baris karena punya ujung baris yang salah.
Paul Tomblin

2
Tidak. Cara saya mengganti apa pun yang merupakan ujung baris dalam file dengan akhir baris yang benar.
Paul Tomblin

7
Ini untuk masalah yang berbeda ketika file Anda TIDAK ADA baris baru di dalamnya, yang saya akui lebih umum. FYI ^ M dapat dicocokkan dengan \ r
dlamblin

12
Ini adalah perintah yang sangat misterius, tetapi bekerja untuk saya di mac.
Eric Walker

5
Saya menemukan yang setara %s/\r/\r/gbekerja dengan baik di MacVim untuk file yang hanya menunjukkan ^Mdi akhir baris (satu baris panjang dalam istilah MacVim). Jelas artinya hal yang berbeda dalam pola vs penggantian bagian dari perintah ini.
RichVel

184

Di dalam vim, lihat format file - DOS atau Unix:

:set filetype=unix

:set fileformat=unix

File akan ditulis kembali tanpa karakter carriage return (CR, ^ M).


3
use: set fileformat = unix Untuk kebanyakan konfigurasi filetype hanya mengubah tipe sintaksis yang digunakan.
derGral

6
Ini memperbaiki bug yang saya alami ... Vim mulai berpikir file berformat UNIX saya adalah windows dan baris yang baru diubah menunjukkan ^ M di dalam git diff.
Thomas Hunter II

Harus bergantung pada sistem. Hari ini, yang ini berhasil. Perintah yang ditetapkan dilakukan dalam vim, btw.
Gbarry

1
hebat! karena format file dos, atur menjadi unix, dan tidak apa
zhaozhi

3
Ini juga berfungsi pada vi BTW, dan Anda bisa lakukan set ff=unixsebagai jalan pintas kecil dengan cara yang sama ftadalah jalan pintas untukfiletype
Posva

110

File yang saya buat dengan BBEdit yang terlihat di MacVim menampilkan banyak ^Mbaris, bukan yang biasa. Penggantian string berikut menyelesaikan masalah - harap ini membantu:

:%s/\r/\r/g

Ini menarik karena saya mengganti jeda baris dengan karakter yang sama, tapi saya kira Vim hanya perlu mendapatkan yang baru untuk ditampilkan dengan benar. Saya tertarik untuk mengetahui mekanisme yang mendasari mengapa ini berhasil.


1
Ada kecenderungan fungsi pencarian untuk menerima aturan yang lebih luas untuk mengenali urutan end-of-line. Tetapi memiliki makna khusus ketika sedang ditulis sebagai data.
Gbarry

Ini bekerja untuk saya di Windows gVim untuk memilah file yang tidak memiliki jeda baris, cukup banyak ^ M sebagai gantinya.
Flash

2
Dari semua solusi yang ditawarkan pada halaman ini, ini adalah satu-satunya pola yang berhasil bagi saya dalam menghapus ^ M dari file csv. Menggunakan MacVim.
B6431

+1 Bekerja untuk saya juga saat SSHing ke Ubuntu Trusty dari Windows menggunakan Mobaterm
Carl

Jadi, ini sepertinya menggantikan semua \rkarakter dengan \nmeskipun menentukan \rsebagai pengganti. Tidak mengeluh, itulah yang saya inginkan. Sangat aneh.
donat

34

Pertama, gunakan :set ff? untuk mencari tahu format file file Anda.

Saya kira bisa jadi unix, maka masalahnya adalah file Anda dibuat dengan fileformat=dosmenambahkan "^ M ^ J" ke baris akhir tetapi baca denganflieformat=unix hanya menghapus "^ J" dari ujung baris, meninggalkan "^ M" di sana.

Cukup masukkan :e ++ff=dosdalam baris perintah Vim untuk mengubah format file Anda dari unix ke dos. Itu harus menyelesaikan masalah. Jika tidak, :%s/\r//gakan membantu Anda.


3
Saya harus melakukan keduanya. :e ++ff=doslalu :set ff=unixdan:w
Max

29

untuk mendapatkan karakter ^ M yang cocok, saya harus memilihnya secara visual dan kemudian menggunakan perintah OS copy to clipboard untuk mengambilnya. Anda dapat mengujinya dengan melakukan pencarian karakter sebelum mencoba perintah ganti.

/^M

harus memilih garis buruk pertama

:%s/^M/\r/g

akan mengganti semua errant ^ M dengan carriage return.

Ini sebagai fungsi di MacVim, yang didasarkan pada gvim 7.

EDIT:

Mengalami masalah ini lagi di mesin Windows 10 saya, yang memiliki Ubuntu untuk Windows, dan saya pikir ini menyebabkan masalah format file untuk vim. Dalam hal ini mengubah ff menjadi unix, mac, atau dos tidak melakukan apa pun selain mengubah ^ M ke ^ J dan kembali lagi.

Solusi dalam hal ini:

:%s/\r$/ /g
:%s/ $//g

Alasan saya memilih rute ini adalah karena saya ingin memastikan bahwa saya tidak merusak file saya. Saya bisa saja :%s/\r$//gtetapi itu akan menghapus carriage return out, dan dapat memiliki hasil yang tidak terduga. Alih-alih, kita mengubah karakter CR singular, di sini a ^ M karakter, menjadi spasi, dan kemudian menghapus semua spasi di akhir baris (yang bagi saya adalah hasil yang diinginkan terlepas dari)

Maaf telah menghidupkan kembali pertanyaan lama yang sudah lama dijawab, tetapi tampaknya ada beberapa kebingungan yang terjadi dan saya pikir saya akan membantu menjernihkan sebagian dari itu karena ini muncul tinggi dalam pencarian google.


1
menekan ctrl-v ctrl-m dapat berfungsi untuk menyisipkan karakter, juga, fwiw. tetapi apa yang memasukkan carriage return yang tepat.
Metagrapher

1
Ini adalah jawaban yang benar. Seperti yang dikatakan di atas, gunakan <ctrl-v> <ctrl-m> untuk memasukkan ^ M literal ke dalam perintah.
carlosayam

1
Saya setuju, meskipun saya yakin bahwa jika itu berhasil untuk saya pada saat posting asli maka saya tidak akan memposting. ;)
Metagrapher

22

Tak satu pun dari ini bekerja untuk saya, jadi saya mencoba ini, yang berhasil:

Tipe :%s/

tekan CTRL-VCTRL-M

Tipe //g

tekan Enter

Jadi perintah keseluruhan di Vim seharusnya terlihat seperti :%s/^M//g

Kegunaannya: :%s(temukan dan ganti) /^M/(simbol itu) /(tanpa karakter) g(secara global).


Menghantam!! Bekerja di Mac.
shamail


15

Tanpa perlu menggunakan Ctrl: :%s/\r$//


1
Ini adalah cara saya melakukannya juga. Saya tidak pernah ingat perintah
pixel 67

Ini adalah cara yang disarankan untuk menghapus ujung ini.
Metagrapher


12

Saya melakukan ini dengan sed:

sed -i -e 's/\r/\n/g' filename


Apakah Anda yakin ini berhasil? Pada OSX: sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand

Ya itu berfungsi (saya sering menggunakannya), tetapi pada OSX jika Anda tidak menginstal sed versi GNU maka mungkin tidak berfungsi. Versi sed yang dikirimkan Apple secara default jauh berbeda (sayangnya) daripada versi GNU yang dikirimkan pada semua distro Linux. Lihatlah jawaban untuk pertanyaan ini untuk bantuan lebih lanjut: stackoverflow.com/q/30003570/2062384
Freedom_Ben

Terima kasih @Freedom_Ben. Jadi sepertinya ini bekerja untuk GNU sedtetapi tidak BSD sed(seperti yang ditemukan di OSX). Siapa pun yang memperbaiki linebreak mungkin bekerja dengan campuran sistem operasi, jadi akan sangat berguna untuk mengetahui kapan jawaban akan bekerja.
Armand

10

Bagaimana dengan hanya: :%s/\r//g Itu benar-benar bekerja untuk saya.

Yang dilakukan adalah membersihkan ujung garis dari semua baris, menghapus ^ M dan hanya itu.


9

Ada banyak jawaban lain untuk pertanyaan ini, tetapi tetap saja, berikut ini yang terbaik bagi saya, karena saya membutuhkan solusi baris perintah:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

Penjelasan:

  • Tanpa memuat file .vimrc, buka myfile
  • Lari :e ++ff=dos untuk memaksa memuat ulang seluruh file sebagai akhiran baris dos.
  • Jalankan :w ++ff=unixuntuk menulis file menggunakan ujung baris unix
  • Keluar dari vim

3
Terima kasih! ini memperbaiki masalah saya dan bermanfaat untuk digunakan dalam skrip
Peddipaga

8

Ctrl+ Mmeminimalkan jendela saya, tetapi Ctrl+ Entersebenarnya menyisipkan ^Mkarakter. Saya juga harus memastikan untuk tidak mengangkatCtrl kunci di antara mesin cetak.

Jadi solusi bagi saya adalah:

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

Di mana <Ctrl-V><Ctrl-Enter>berarti menekan dan menahan Ctrl , tekan dan lepaskan V, tekan dan lepaskan Enter, lalu lepaskan Ctrl .

Jika Anda bekerja pada file yang dihasilkan Windows

Solusi di atas akan menambahkan baris tambahan antara baris yang ada, karena sudah ada yang tidak terlihat \rsetelah ^M.

Untuk mencegah ini, Anda ingin menghapus ^Mkarakter tanpa menggantinya.

:%s/<Ctrl-V><Ctrl-Enter>//g

Di mana %berarti "dalam buffer ini," sberarti "pengganti," /berarti "(temukan) pola berikut," <Ctrl-V><Ctrl-Enter>mengacu pada tombol untuk menekan untuk mendapatkan ^Mkarakter (lihat di atas), //berarti "tanpa apa-apa" (atau, "dengan pola antara dua garis miring ini, yang kosong "), dan gmerupakan bendera yang berarti" secara global, "yang bertentangan dengan kemunculan pertama dalam sebuah garis.


7

Ini bekerja untuk saya:

  1. Setel format file ke unix ( \nakhir baris)
  2. simpan file

Jadi dalam vim:

:set ff=unix
:w

1
Yang ini bekerja untuk saya, sedangkan jawaban yang diterima tidak.
Marcello Romani

7

Dalam hal ini,

Tidak ada yang berhasil, saya memiliki file CSV yang disalin ke mesin Linux dari mac saya dan saya menggunakan semua perintah di atas tetapi tidak ada yang membantu kecuali yang di bawah ini

tr "\015" "\n" < inputfile > outputfile

Saya punya file di mana ^ M karakter sandwitched antara baris sesuatu seperti di bawah ini

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,

5

Atau, ada utilitas open-source yang disebut dos2unix dan unix2dos tersedia yang melakukan hal ini. Pada sistem linux, mereka mungkin diinstal secara default; untuk sistem windows Anda dapat mengunduhnya dari http://www.bastet.com/ antara lain.


5
sed s/^M//g file1.txt > file2.txt

di mana ^ M diketik dengan secara bersamaan menekan 3 tombol, ctrl + v + m


4

gunakan utilitas dos2unix jika file dibuat di windows, gunakan utilitas mac2unix jika file tersebut dibuat di mac. :)


belum pernah mendengar mac2unix sebelumnya, akan mengalami peningkatan suara lagi jika saya bisa!
Kuf

Huray! ini cara untuk pergi!
Prajurit



1

Untuk menyimpan penekanan tombol , Anda dapat menghindari mengetik Ctrl+ VCtrl+ Mdengan menempatkan ini dalam pemetaan. Cukup buka file yang berisi karakter ^ M, tarik, dan tempel ke baris seperti ini di .vimrc Anda:

nnoremap <Leader>d :%s/^M//g<CR>

1

Tidak satu pun dari saran ini yang bekerja untuk saya setelah berhasil mendapatkan banyak ^Mjeda baris saat bekerja dengan vim dan gerhana. Saya menduga bahwa saya menemukan kasus luar tetapi jika itu membantu siapa pun saya lakukan.

:%s/.$//g

Dan itu menyelesaikan masalah saya


Ini akan menghapus karakter APA SAJA di akhir baris. Jika Anda memiliki garis yang tidak, karena alasan tertentu, diakhiri oleh ^ M, maka Anda akan menghapus karakter itu juga, dan tidak terduga. Seharusnya tidak demikian, tetapi jika memang demikian, dan Anda tidak mengetahui hal ini, maka Anda dapat menodai file Anda dengan cara yang sangat sulit diidentifikasi.
Metagrapher

1
:g/^M/s// /g

Jika Anda mengetik ^MmenggunakanShift+6 Caps+M tidak akan menerima.

Anda perlu mengetik ctrl+v ctrl+m.


1

^Mmemberikan jeda baris yang tidak diinginkan. Untuk menangani ini kita dapat menggunakan sedperintah sebagai berikut:

sed 's/\r//g'

idk mengapa ini diturunkan ke -1 ... karena menggunakan sed? Anda dapat melakukan substitusi yang sama di dalam vim dan itu seharusnya bekerja
Metagrapher

1

Hapus saja set binary.vimrc Anda!


Di satu utas lainnya, "set binary" direkomendasikan untuk menyingkirkan sisipan otomatis dari baris baru.
dexter2305

1

Untuk digunakan seddi MacOS, lakukan ini:

sed -i.bak $'s/\r//' <filename>

Penjelasan: The $'STRING'sintaks di sini berkaitan dengan shell bash. Mac tidak memperlakukan \rsebagai karakter khusus. Dengan mengutip string perintah di $''Anda memberitahu shell untuk mengganti \rdengan \rkarakter aktual yang ditentukan dalam standar ANSI-C.


0

"Fungsi ini menyimpan daftar lompatan

fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
    set ff=unix
    w!
    "%s/\%x0d$//e
catch /E32:/
    echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()

Dalam hal ini, apa yang salah dengan menggunakan perintah dos2unix asli * NIX? linux.die.net/man/1/dos2unix
Metagrapher

0

Saya telah menghabiskan sore itu berjuang dengan \ n ctrl-v 012 (keduanya memasok saya dengan nol). & bekerja melalui utas ini sampai saya mencapai metagrapher.

\r bekerja dengan baik untuk saya!

/),/s/),/)\r/g

mengubah sesuatu seperti ini:

blacklist-extra: i386 (0.4.1, 0.4.1 + nmu1), libmount1: i386 (2.20.1-5.1, 2.20.1 -5.2), libblkid1: i386 (2.20.1-5.1, 2.20.1-5.2) , libapt-pkg4.12: i386 (0.9.7.4, 0.9.7.5), nmap: i386 (6.00-0.1, 6.00-0.2), libsane-common: i386 (1.0.22-7.3,

menjadi sesuatu seperti ini:

26 libwv-1.2-4: i386 (1.2.9-3, otomatis)
27 openjdk-6-jre-headless: i386 (6b24-1.11.4-3, otomatis)
28 jed: i386 (0.99.19-2.1)

Sihir. Saya sangat berterima kasih

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.