Apa itu `^ M` dan bagaimana cara saya menghilangkannya?

134

Ketika saya membuka file vim, saya melihat ^Mkarakter aneh .

Sayangnya, mesin pencari favorit di dunia tidak bekerja dengan baik dengan karakter khusus dalam permintaan, jadi saya bertanya di sini:

  • ^MKarakter apa ini ?

  • Bagaimana itu bisa ada di sana?

  • Bagaimana saya menyingkirkannya?

Christoph Wurm
sumber
3
Vlastimil itu adalah suntingan yang sia-sia. Got adalah bentuk lampau yang tepat dalam Bahasa Inggris Britania.
Jesse_b
1
Ini adalah digraf karakter kontrol, untuk info lebih lanjut: help digraph-table.
Eric Leschinski

Jawaban:

108

Ini ^Madalah karakter carriage-return. Jika Anda melihat ini, Anda mungkin melihat file yang berasal dari dunia DOS / Windows, di mana end-of-line ditandai oleh pasangan carriage return / newline, sedangkan di dunia Unix, end-of-line ditandai oleh satu baris baru.

Baca artikel ini untuk detail lebih lanjut, dan juga entri Wikipedia untuk baris baru .

Artikel ini membahas cara mengatur vim untuk mengedit file secara transparan dengan berbagai penanda end-of-line.

Jika Anda memiliki file dengan ^Mdi akhir beberapa baris dan Anda ingin menyingkirkannya, gunakan ini di Vim:

:s/^M$//

(Tekan Ctrl+ V Ctrl+ Muntuk menyisipkan itu ^M.)

larsks
sumber
11
:%s/^M/\r/gAlih-alih, coba hapus ^Mdan ganti ^Mdengan karakter baris baru \r. Tanpa %, perintah hanya berlaku untuk baris saat ini. Dan saya menemukan beberapa contoh di mana ^Mtidak ada di ujung jalur, sepertiThe first line.^MThe second line.
George
Atau jika Anda tidak ingin banyak jeda baris yang bisa Anda lakukan:%s/^M/
hati1
2
Jika hanya carriage return dengan sendirinya, itu mungkin jeda baris Macintosh klasik (pra-Unix). Bahkan beberapa program yang lebih baru seperti Excel 2007 untuk Mac melakukan itu untuk beberapa alasan.
sudo
@ larsks Tapi altap.cz/salamander/help/salamand/appendix_txtfiles mengatakan bahwa ^Mini digunakan di UNIX
Vivek
Artikel yang Anda tautkan mengatakan yang \ndigunakan di Unix, mana yang benar. Itu adalah kode ASCII 10, atau dikenal sebagai ^J.
larsks
39

Sebagian besar sistem operasi UNIX memiliki utilitas yang disebut dos2unixyang akan mengubah CRLF ke LF. Jawaban lainnya mencakup pertanyaan "apa yang mereka".

Aaron Brown
sumber
36

Cara sederhana untuk melakukan ini adalah dengan menggunakan perintah berikut:

dos2unix filename

Perintah ini juga berfungsi dengan pola lintasan, Eg

dos2unix path/name*

Jika tidak berhasil, coba gunakan mode yang berbeda:

dos2unix -c mac filename
  • -cTetapkan mode konversi. Di mana CONVMODE adalah salah satu dari: ascii, 7bit, iso, macdengan asciimenjadi default.
AnonGeek
sumber
22

Ini berhasil untuk saya

:e ++ff=dos 

Perintah: e ++ ff = dos memberi tahu Vim untuk membaca file lagi, memaksa format file dos. Vim akan menghapus ujung garis CRLF dan hanya LF, hanya menyisakan teks dari setiap baris dalam buffer.

kemudian

:set ff=unix 

dan akhirnya

:wq 
Stryker
sumber
3
Terima kasih! ini bekerja untuk saya tetapi solusi yang diterima tidak
penggemar Bjorks nomor satu
Apakah ffmengacu pada format file? Bagaimana dengan ++ff?
KcFnMi
Perintah: e ++ ff = dos memberi tahu Vim untuk membaca file lagi, memaksa format file dos. Vim akan menghapus ujung garis CRLF dan hanya LF, hanya menyisakan teks dari setiap baris dalam buffer.
Stryker
10

Cara lain untuk menghilangkan carriage return adalah dengan trperintah.

Saya memiliki skrip kecil yang terlihat seperti ini

#!/bin/sh
tmpfile=$(mktemp)
tr -d '\r' <"$1" >"$tmpfile"
mv "$tmpfile" "$1"
Johan
sumber
6

Anda dapat membersihkan ini dengan sed:

sed -e 's/^M$//' < infile > outfile

Caranya adalah bagaimana memasukkan carriage-return dengan benar. Secara umum, Anda perlu mengetik C-v C-muntuk memasukkan carriage return secara literal. Anda juga dapat melakukan pekerjaan sed

sed -i.bak -e 's/^M$//' infile
Dale Hagglund
sumber
2

Apa ini ^ M?
^ M adalah karakter carriage-return. Jika Anda melihat ini, Anda mungkin melihat file yang berasal dari dunia DOS / Windows, di mana end-of-line ditandai oleh pasangan carriage return / newline, sedangkan di dunia Unix, end-of-line ditandai oleh satu baris baru.

Bagaimana itu bisa sampai di sana?
Ketika ada perubahan dalam format file.

Bagaimana saya menyingkirkannya?
buka file Anda dengan

vim -b FILE_PATH

simpan dengan perintah berikut

:%s/^M//g
Prashant Kanse
sumber
Anda telah salah ketik membuka filr Anda .
Mateusz Piotrowski
4
Jawaban ini tidak menambahkan apa pun ke jawaban lain. Paragraf pertama hampir merupakan salinan kata demi kata dari jawaban yang diterima. Kode yang diberikan tidak akan menyimpan apa pun, tetapi cukup hapus semua karakter carriage return dari semua baris. Dan saya tidak yakin bagaimana membuka file dalam mode biner akan membantu di sini.
Dubu
2

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,
Vishwanath gowda k
sumber
0

Anda dapat menggunakan Vim dalam mode Ex:

ex -bsc '%s/\r//|x' file
  1. -b mode biner

  2. % pilih semua garis

  3. s pengganti

  4. \r Kereta kembali

  5. x Simpan dan tutup

Steven Penny
sumber
0

Tambahkan baris berikut ke ~ / .vimrc Anda

command! Tounix :call Preserve('1,$s/^M//')

Kemudian ketika Anda memiliki file dengan ujung baris Windows, jalankan perintah ": Tounix".

Charlie Dalsass
sumber
-1

Di masa lalu, saya telah melihat bahkan file konfigurasi tidak diuraikan dengan benar dan mengeluh tentang spasi putih, tetapi jika Anda vi dan melakukan daftar set itu tidak akan menampilkan spasi, grep nama file [[spasi]] akan menunjukkan kepada Anda ^ M

saat itulah dos2unix filemembantu

Sriram
sumber
Jawaban ini tidak membawa apa pun yang baru, does2unix sudah disebutkan setidaknya dalam dua jawaban yang jauh lebih tua.
Rui F Ribeiro