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?

Bert Hekman
sumber
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.

pjz
sumber
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
Ludvig A. Norin
sumber
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 :)


sumber
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
Sylvain Defresne
sumber
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.


sumber
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.

mercutio
sumber
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)

Sparkida
sumber
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
Venkataramesh Kommoju
sumber
6

Langkah-langkah berikut dapat mengonversi format file untuk dos menjadi unix:

:e ++ff=dos  Edit file again, using dos file format ('fileformats' is ignored).[A 1]
:setlocal ff=unix    This buffer will use LF-only line endings when written.[A 2]
:w   Write buffer using unix (LF-only) line endings.

Referensi: http://vim.wikia.com/wiki/Change_end-of-line_format_for_dos-mac-unix

ajitomatix
sumber
6

Dengan perintah berikut:

:%s/^M$//g 

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

Dave Webb
sumber
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
Dannid
sumber
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.

Stefan Sjöberg
sumber
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.

Rob Wells
sumber
4

Kamu bisa menggunakan:

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

atau dos2unix utility.

Christy Wald
sumber
3

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

JayG
sumber
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
Maerlyn
sumber
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

Tallak Tveide
sumber
2

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

CBuzatu
sumber
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}";
}
dsm
sumber
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 <[email protected]>
Albaro Pereyra
sumber
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.

minuman ringan
sumber
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
Thomas PABST
sumber
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.

Santle Camilus
sumber
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
pengguna3379574
sumber