Karakter '^ M' di akhir baris

99

Ketika saya menjalankan skrip SQL tertentu di lingkungan Unix, saya melihat karakter '^ M' di akhir setiap baris skrip SQL saat itu bergema ke baris perintah. Saya tidak tahu di OS mana skrip SQL awalnya dibuat.

Apa yang menyebabkan ini dan bagaimana cara memperbaikinya?

Paul Reiners
sumber

Jawaban:

79

Ini disebabkan oleh karakter akhir baris DOS / Windows. Seperti yang dikatakan Andy Whitfield, perintah Unix dos2unix akan membantu memperbaiki masalah. Jika Anda menginginkan informasi lebih lanjut, Anda dapat membaca halaman manual untuk perintah itu.

Thomas Owens
sumber
3
Pada beberapa sistem (yaitu Ubuntu) nama perintah ini adalah "fromdos"
bobwienholt
6
Anda bisa mendapatkan alat ini di OSX dengan sangat mudah dengan brew install dos2unixmenginstal homebrew
philipp
73

Perbaiki akhiran baris videngan menjalankan yang berikut ini:

:set fileformat=unix

:w

Tim Abell
sumber
2
Ini jawaban yang brilian. Terimakasih banyak. (menyimpan instalasi dos2unix, alat yang mungkin hanya saya gunakan sekali)
Jamsi
3
ini tidak menghapus ^Ms karena alasan tertentu. file referensi: /etc/timidity/fluidr3_gm.cfg.
phil294
39

Penyebabnya adalah perbedaan antara bagaimana OS berbasis Windows dan OS berbasis Unix menyimpan penanda akhir baris.

Sistem operasi berbasis Windows, berkat warisan DOS mereka, menyimpan end-of-line sebagai sepasang karakter - 0x0D0A(carriage return + line feed). Sistem operasi berbasis Unix hanya menggunakan 0x0A( umpan baris ). Yang ^MAnda lihat adalah representasi visual dari 0x0D( kereta kembali ).

dos2unix akan membantu dengan ini. Anda mungkin juga perlu menyesuaikan sumber skrip menjadi 'ramah Unix'.

ColinYounger
sumber
Saya tidak akan mengatakan versi Windows saat ini memiliki semua jenis warisan DOS . Mereka masih memiliki batasan kompatibilitas.
Joey
Ini adalah cara yang mudah, apakah Anda melakukan alat konversi otomatis. Terima kasih
Pjl
Tapi kenapa ^M? Mengapa '^'? Mengapa 'M'?
1737973
Karena itu adalah "karakter kontrol". "^" adalah representasi visual dari mengklik tombol kontrol. Di bawah byte spesifiknya, ^ adalah bagaimana editor merepresentasikannya.
Hejazzman
24

Cara termudah adalah dengan menggunakan vi. Saya tahu kedengarannya mengerikan tetapi sederhana dan sudah diinstal di sebagian besar lingkungan UNIX. ^ M adalah baris baru dari lingkungan Windows / DOS.

dari prompt perintah: $ vi filename

Lalu tekan " :" untuk masuk ke mode perintah.

Search and Replace all Globally is :%s/^M//g" Tekan dan tahan kontrol lalu tekan V lalu M " yang akan menggantikan ^ M dengan tidak ada.

Kemudian untuk menulis dan keluar masukkan " :wq" Selesai!

Bernie Perez
sumber
Bagaimana cara menggantinya di emacs?
herbertD
Terima kasih! VI (M) luar biasa!
Ionică Bizău
3
Terima kasih atas penjelasan tentang cara mengetik karakter ^ M! Saya akan menggantinya dengan \ r sebagai gantinya. Jadi saya lakukan:% s / ^ M / \ r / g
aharris88
13

Coba gunakan dos2unix untuk menghapus ^ M.

Andy Whitfield
sumber
10

Di vi, lakukan a :%s/^M//g

Untuk mendapatkan tombol ^Mtahan CTRL, tekan Vlalu M(Keduanya sambil menahan tombol kontrol) dan ^Makan muncul. Ini akan menemukan semua kejadian dan menggantikannya dengan apa-apa.

dogbane
sumber
2
Untuk mengganti ^ M dengan jeda baris ramah unix::%s/^M/\r/g
Gary Oak
8

Skrip SQL awalnya dibuat di OS Windows. Karakter '^ M' adalah hasil dari Windows dan Unix yang memiliki ide berbeda tentang apa yang akan digunakan untuk karakter akhir baris. Anda dapat menggunakan perl di baris perintah untuk memperbaikinya.

perl -pie 's/\r//g' filename.txt
Bill the Lizard
sumber
Tentu, Anda BISA menggunakan perl, tetapi apakah Anda menyarankan perl di atas dos2unix?
Thomas Owens
2
Saya hanya memberikan alternatif, karena empat orang sudah mengatakan untuk menggunakan dos2unix.
Bill the Lizard
2
Ya, menurut saya ini berguna karena saya menggunakan stasiun kerja terbelakang yang bekerja di kantor dengan departemen TI prasejarah. Kecuali saya menggunakan variasi: perl -pi -e "s / \ x0D / \ n / g" file.csv
Rimian
7

^ M biasanya disebabkan oleh baris baru operator Windows, dan diterjemahkan ke Unix terlihat seperti ^ M. Perintah dos2unix harus menghapusnya dengan baik

dos2unix [opsi] [-c kode konv] [-o file ...] [-n infile outfile ...]

jW.
sumber
5
C:\tmp\text>dos2unix hello.txt helloUNIX.txt

Sed bahkan lebih banyak tersedia dan dapat melakukan hal semacam ini juga jika dos2unix tidak diinstal

C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt  

Anda juga dapat mencoba tr:

cat hello.txt | tr -d \r > helloUNIX2.txt  

Berikut hasilnya:

C:\tmp\text>dumphex hello.txt  
00000000h: 48 61 68 61 0D 0A 68 61 68 61 0D 0A 68 61 68 61 Haha..haha..haha  
00000010h: 0D 0A 0D 0A 68 61 68 61 0D 0A                   ....haha..  

C:\tmp\text>dumphex helloUNIX.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

C:\tmp\text>dumphex helloUNIX2.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  
Alex Bolotov
sumber
4

Untuk mengganti karakter ^ M di editor vi gunakan di bawah ini

buka file teks katakan t1.txt

vi t1.txt

Masuk ke mode perintah dengan menekan shift + :

lalu tekan tombol seperti yang disebutkan %s/^M/\r/g

in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
leela
sumber
Baris terakhir Anda adalah apa yang saya lewatkan dari semua jawaban sebelumnya. Saya terus mendapatkan 'tidak ada kecocokan yang ditemukan karena saya melakukan shift + 6, jadi saya melakukan apa yang setiap peretas akan lakukan dan menghindari kesalahpahaman saya dengan solusi saya sendiri: rekam makro untuk melakukan $ untuk pergi ke akhir setiap baris dan kemudian tekan x, cukup ulangi makro untuk jumlah baris dalam file.
darethas
3

Alternatif untuk dos2unixperintah akan menggunakan utilitas standar seperti sed.

Misalnya, dos untuk unix:

sed 's/\r$//' dos.txt > unix.txt

unix ke dos:

sed 's/$/\r/' unix.txt > dos.txt
g4th
sumber
1

Anda dapat menghapus ^ M dari file secara langsung melalui perintah sed, misalnya:

sed -i'.bak' s/\r//g *.*

Jika Anda senang dengan perubahan tersebut, hapus file .bak:

rm -v *.bak
kenorb
sumber
0

od -a $file berguna untuk mengeksplorasi jenis pertanyaan tersebut di Linux (mirip dengan dumphex di atas).

Allan Wind
sumber
0

Di Perl, jika Anda tidak ingin menyetel $ / variable dan menggunakan chomp (), Anda juga bisa melakukan:

$var =~ /\r\n//g;

Dua sen saya

Ariel Monaco
sumber
-1

Perintah vi lain yang akan dilakukan: :%s/.$// Ini menghapus karakter terakhir dari setiap baris di file. Kelemahan dari perintah cari dan ganti ini adalah tidak peduli apa karakter terakhirnya, jadi berhati-hatilah untuk tidak memanggilnya dua kali.

Scottie T
sumber
Mengapa menyebutkannya jika Anda tahu itu tidak dapat diandalkan?
Minexew