Konversi ujung garis DOS ke ujung garis Linux di vim


717

Jika saya membuka file yang saya buat di Windows, semua baris berakhir dengan ^M.
Bagaimana cara saya menghapus karakter ini sekaligus?


Jika Anda melakukan hexdump -C badfiledan melihat 0x0d 0x0a "\r\n"itu adalah masalah Anda.
Yzmir Ramirez

Jawaban:


1075

dos2unix adalah utilitas commandline yang akan melakukan ini, atau :%s/^M//gakan jika Anda menggunakan Ctrl- v Ctrl- muntuk memasukkan ^ M, atau Anda bisa :set ff=unixdan vim akan melakukannya untuk Anda.

Documents pada pengaturan 'format file' ada di sini , dan wiki vim memiliki halaman komprehensif tentang konversi akhir baris .

Sebagai alternatif, jika Anda sering memindahkan file, Anda mungkin tidak ingin mengonversinya, tetapi melakukannya :set ff=dos, jadi vim akan tahu itu adalah file DOS dan menggunakan konvensi DOS untuk akhir baris.


56
:%s/^M//gseharusnya :%s/\r//g, karena ^Mhanya berarti "cocokkan modal" M "di awal baris".
Bunyk

78
Tidak jika Anda melakukan seperti yang dikatakan jawabannya dan 'gunakan ctrl-v ctrl-m untuk memasukkan ^ M'.
pjz

2
crtl-v tidak bagus, di windows itu menempel konten clipboard ke baris perintah. Solusi :%s/\r//gbekerja untuk saya, tepuk tangan @Bunyk
roblogic

3
@ropata Apa yang Anda inginkan pada Windows adalah ctrl-q .
ruffin

2
Saya pasti kehilangan sesuatu, karena set ff=unixtidak melakukan apa-apa. Mungkin itu mengkonversi file, tetapi semua ^Mkarakter masih ada di sana.
felwithe

276

Ubah ujung garis dalam tampilan:

:e ++ff=dos
:e ++ff=mac
:e ++ff=unix

Ini juga dapat digunakan sebagai operasi penghematan (: w saja tidak akan menyimpan menggunakan ujung garis yang Anda lihat di layar):

:w ++ff=dos
:w ++ff=mac
:w ++ff=unix

Dan Anda dapat menggunakannya dari command-line:

for file in *.cpp
do 
    vi +':w ++ff=unix' +':q' "$file"
done

4
Terima kasih banyak. Saya mencoba vi + ': wq ++ ff = unix' <filepath> untuk yang malas seperti saya.
a_secenthusiast

2
Ini harus menjadi jawaban yang paling banyak dipilih. :w +ff=unixjauh lebih bagus daripada kebanyakan hal lain yang ditulis di sini, dan skrip bash adalah bonus yang bagus.
mkasberg

The :eperintah tidak muncul untuk melakukan apa-apa pada saya Windows vim menginstal. Pandangan saya masih menunjukkan ^Mkode.
Grant Birchmeier

160

Saya biasanya menggunakan

:%s/\r/\r/g

yang tampaknya sedikit aneh, tetapi bekerja karena cara yang sesuai dengan linefeeds vim. Saya juga merasa lebih mudah diingat :)


9
Ini bekerja secara konsisten di seluruh platform. Jawaban terbaik di sini.
thebigjc

4
Saya tidak pernah memiliki masalah dengan :set ff=unixsebelumnya, tetapi file yang saya buka hari ini pasti sangat aneh. Vim mengatakan itu sudah fileformat=unixtetapi semua akhir baris sudah ^M. Solusi ini berhasil untuk saya.
Chris B

15
Solusi ini menambahkan baris ekstra yang tidak diinginkan untuk saya, menggandakan jumlah baris dalam file. :%s/\r//galih-alih bekerja untuk saya.
Victor Zamanian

3
Victor, file Anda kemungkinan memiliki akhiran. \ r tidak dibaca sebagai baris baru tetapi \ n adalah. Dalam file yang saya jalankan adalah dan Anda harus menambahkan karakter baris baru.
Joeyjoejoejr

2
@ VictorZamanian's :%s/\r//gadalah satu - satunya solusi tujuan umum - terutama untuk file mode campuran yang berisi campuran heterogen dari baris baru gaya DOS dan UNIX. Solusi kanonik (mis. :set ff=unix, :e ++ff=unix) Mengasumsikan setiap baris buffer saat ini berakhir dengan gaya baris baru yang sama. Terkadang mereka melakukannya; terkadang tidak. Isyarat wajah sedih.
Cecil Curry

97

Saya lebih suka menggunakan perintah berikut:

:set fileformat=unix

Anda juga dapat menggunakan macataudos untuk mengonversi file Anda masing-masing ke macintosh atau konvensi file MS-DOS / MS-Windows. Dan tidak ada artinya jika file sudah dalam format yang benar.

Untuk informasi lebih lanjut, lihat bantuan vim:

:help fileformat

1
Perintah ini tampaknya tidak melakukan apa pun pada vim Windows saya. Pandangan saya masih memiliki ^Mkarakter di dalamnya.
Grant Birchmeier

Menambahkan set fileformat=unixke file .vimrc saya berfungsi.
Joey Allen

20

:set fileformat=unix untuk mengkonversi dari dos ke unix.


1
Ini sebenarnya menyelesaikan masalah bagi saya. Saya tidak dapat menemukan karakter tersebut saat mencari.
Kapten Insaneo

20
:%s/\r+//g

Di Vim, itu menghapus semua carriage return, dan hanya menyisakan baris baru.


2
Untuk beberapa alasan di atas tidak bekerja untuk saya di bawah windows gvim. Tetapi ketika diubah untuk :%s/\r//gitu bekerja seperti pesona.
soltysh

1
@soltysh:% s / \ r \ + $ // g
thinker3


10

Konversi direktori file dari dos ke Unix

Menggunakan baris perintah dan sed, temukan semua file di direktori saat ini dengan ekstensi ".ext" dan hapus semua "^ M"

@ https://gist.github.com/sparkida/7773170

find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;

juga, seperti yang disebutkan di atas ^ M = Ctrl+V+ Ctrl+M(jangan ketik simbol "^" dan M)


9

dos2unix dapat langsung memodifikasi isi file.

Anda dapat langsung menggunakannya pada file, tanpa perlu pengalihan file sementara.

dos2unix input.txt input.txt

Di atas menggunakan keyboard AS yang diasumsikan. Gunakan -opsi 437 untuk menggunakan keyboard Inggris.

dos2unix -437 input.txt input.txt



6

Dengan perintah berikut:

:%s/^M$//g 

Dapatkan ^Mjenis yang muncul CtrlVkemudian CtrlM. CtrlVmemberitahu Vim untuk mengambil karakter berikutnya yang dimasukkan secara harfiah.


6

Komentar tentang membuat ^ M muncul adalah apa yang berhasil bagi saya. Hanya mengetik "^ M" di vi saya tidak mendapatkan apa-apa (tidak ditemukan). Urutan CTRL+ V CTRL+ Mmelakukannya dengan sempurna.

Perintah substitusi kerja saya adalah

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

dan itu terlihat seperti ini di layar saya:

:%s/^M/\r/g

4
Anda bisa menggunakan :%sbukan :1,$s. %adalah singkatan 1,$.
the Tin Man

5

Saya menemukan cara yang sangat mudah: Buka file dengan nano: nano file.txt

Tekan CTRL+ Ountuk menyimpan, tetapi sebelum menekan Enter, tekan: ALT+ Duntuk beralih antara akhir baris DOS dan Unix / Linux, atau: ALT+ Muntuk beralih antara akhir baris Mac dan Unix / Linux lalu tekan Enteruntuk menyimpan dan CTRL+ Xuntuk keluar.


melakukan ini pada server linux, file tersebut memiliki ^Makhiran. simpan sebagai dos untuk disimpan, simpan sebagai linux untuk dihapus. dapat memeriksa menggunakancat -v
HattrickNZ

Pertanyaan ini tentang vim, bukan nano.
Grant Birchmeier

5
:g/Ctrl-v Ctrl-m/s///

CtrlMadalah karakter \r, atau carriage return, yang ditambahkan oleh akhir baris DOS. CtrlVmemberitahu vim untuk memasukkan CtrlMkarakter literal di baris perintah.

Secara keseluruhan, perintah ini menggantikan semua \rdengan tidak ada, menghapusnya dari ujung garis.


4

Kamu bisa menggunakan:

vim somefile.txt +"%s/\r/\r/g" +wq

atau dos2unix utility.


3

Anda dapat menggunakan perintah berikut: di
:%s/^V^M//g
mana '^' berarti menggunakan CTRLkunci.


2

perintah di bawah ini digunakan untuk memformat ulang semua file .sh di direktori saat ini, saya mengujinya di OS Fedora saya.

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done

2

Dalam vim, ketik:

:w !dos2unix %

Ini akan mem-pipe konten buffer Anda saat ini ke perintah dos2unix dan menulis hasilnya di atas konten saat ini. Vim akan meminta untuk memuat kembali file setelah


2

Untuk menjalankan langsung ke konsol linux: vim file.txt +"set ff=unix" +wq


1

Biasanya ada dos2unixperintah yang dapat Anda gunakan untuk ini, pastikan Anda membaca manual karena versi GNU dan BSD berbeda pada bagaimana mereka menangani argumen.

Versi BSD:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

Versi GNU:

dos2unix $FILENAME

Sebagai alternatif, Anda dapat membuat dos2unixjawaban Anda sendiri dengan jawaban yang diajukan di sini, misalnya:

function dos2unix(){
    [ "${!}" ] && [ -f "{$1}" ] || return 1;

    { echo ':set ff=unix';
      echo ':wq';
    } | vim "${1}";
}

1

Saya tahu saya pernah melihat ini di suatu tempat. Inilah tip login FreeBSD:

Perlu menghapus semua karakter ^ M dari file DOS? Mencoba

tr -d \\r < dosfile > newfile
    -- Originally by Dru <genesis@istar.ca>

0

Meskipun topik ini sudah sangat lama, saya ingin memasukkan hal lain dari wikia:

%s/\r\+$//g

Yang mengisi menemukan semua tanda kembali carriage (satu dan lebih banyak repetisi) hingga akhir baris dan menghapus, jadi hanya \nakan tetap di eol.


0

Ini cara saya. Saya membuka file dalam dos EOL dan ketika saya menyimpan file yang secara otomatis akan dikonversi ke unix EOL

autocmd BufWrite * :set ff=unix

0

jika Anda membuat file di NotePad atau NotePad ++ di windows dan membawanya ke Linux dan membukanya dengan vim, Anda akan melihat ^ M di akhir setiap baris. Untuk menghapus ini,

Di terminal Linux Anda, ketik

dos2unix filename.ext

Ini akan melakukan sihir yang diperlukan.


0

Saya ingin baris baru menggantikan huruf M. Perl untuk penyelamatan:

perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt

Atau untuk menulis ke stdout:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
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.