Bagaimana saya bisa secara pemrograman (yaitu, tidak menggunakan vi
) mengkonversi DOS / Windows baris baru ke Unix?
The dos2unix
dan unix2dos
perintah yang tidak tersedia pada sistem tertentu. Bagaimana saya bisa meniru ini dengan perintah seperti sed
/ awk
/ tr
?
dos2unix
menggunakan manajer paket Anda, itu benar-benar jauh lebih sederhana dan memang ada di sebagian besar platform.Jawaban:
Anda dapat menggunakan
tr
untuk mengkonversi dari DOS ke Unix; namun, Anda hanya dapat melakukan ini dengan aman jika CR muncul di file Anda hanya sebagai byte pertama dari pasangan byte CRLF. Ini biasanya terjadi. Anda kemudian menggunakan:Perhatikan bahwa namanya
DOS-file
berbeda dari namanyaUNIX-file
; jika Anda mencoba menggunakan nama yang sama dua kali, Anda akan berakhir tanpa data dalam file.Anda tidak dapat melakukannya sebaliknya (dengan standar 'tr').
Jika Anda tahu cara memasukkan carriage return ke skrip ( control-V, control-Muntuk memasukkan control-M), maka:
di mana '^ M' adalah karakter kontrol-M. Anda juga dapat menggunakan mekanisme
bash
Kutipan ANSI-C untuk menentukan carriage return:Namun, jika Anda harus melakukan ini sangat sering (lebih dari sekali, secara kasar), jauh lebih masuk akal untuk menginstal program konversi (misalnya
dos2unix
danunix2dos
, atau mungkindtou
danutod
) dan menggunakannya.Jika Anda perlu memproses seluruh direktori dan subdirektori, Anda dapat menggunakan
zip
:Ini akan membuat arsip zip dengan ujung garis diubah dari CRLF ke CR.
unzip
kemudian akan mengembalikan file yang dikonversi (dan meminta Anda file demi file - Anda dapat menjawab: Ya-untuk-semua). Kredit ke @vmsnomad untuk menunjukkan ini.sumber
tr -d '\015' <DOS-file >UNIX-file
manaDOS-file
==UNIX-file
hanya menghasilkan file kosong. File keluaran harus file yang berbeda, sayangnya.sed
opsi GNU-i
(untuk di tempat) berfungsi; batasnya adalah file dan symlink yang ditautkan. Thesort
perintah memiliki 'selalu' (sejak tahun 1979, jika tidak sebelumnya) mendukung-o
opsi yang bisa daftar salah satu file masukan. Namun, itu sebagian karenasort
harus membaca semua inputnya sebelum dapat menulis outputnya. Program lain secara sporadis mendukung menimpa salah satu file input mereka. Anda dapat menemukan program tujuan umum (skrip) untuk menghindari masalah di 'Lingkungan Pemrograman UNIX' oleh Kernighan & Pike.sed -i $'s/\r$//' filename
- untuk mengedit di tempat. Saya bekerja pada mesin yang tidak memiliki akses ke internet, jadi instalasi perangkat lunak adalah masalah.lihat di sini untuk contoh menggunakan
sed
:Gunakan
sed -i
untuk konversi di tempat misalnyased -i 's/..../' file
.sumber
\r
:tr "\r" "\n" < infile > outfile
-d
ditampilkan lebih sering dan tidak akan membantu dalam "hanya\r
" situasi.\r
untuk\n
pemetaan memiliki efek penspasian ganda file; setiap baris CRLF tunggal yang berakhir di DOS menjadi\n\n
di Unix.Melakukan ini dengan POSIX itu rumit:
POSIX Sed tidak mendukung
\r
atau\15
. Bahkan jika itu terjadi, opsi di tempat-i
bukanlah POSIXPOSIX Awk mendukung
\r
dan\15
, bagaimanapun,-i inplace
pilihannya bukan POSIXd2u dan dos2unix bukan utilitas POSIX , tetapi ex adalah
POSIX ex tidak mendukung
\r
,\15
,\n
atau\12
Untuk menghapus pengembalian carriage:
Untuk menambahkan pengembalian carriage:
sumber
tr
\r
Jadi Anda juga bisa menggunakanprintf '%s\n' '%!tr -d "\r"' x | ex file
(meskipun diberikan, ini dihapus\r
bahkan jika tidak segera sebelumnya\n
). Juga,-b
opsi untukex
tidak ditentukan oleh POSIX.Anda dapat menggunakan vim secara terprogram dengan opsi -c {command}:
Dosis ke Unix:
Unix to dos:
"set ff = unix / dos" berarti mengubah format file (ff) dari file ke Unix / DOS format akhir baris
": wq" berarti menulis file ke disk dan keluar dari editor (memungkinkan untuk menggunakan perintah dalam satu lingkaran)
sumber
vi
akan tahu apa:wq
artinya. Bagi mereka yang tidak memiliki 3 karakter berarti 1) membuka area perintah vi, 2) menulis dan 3) berhenti.Menggunakan AWK dapat Anda lakukan:
Menggunakan Perl dapat Anda lakukan:
sumber
awk
.Untuk mengonversi file di tempat, gunakan
Untuk menampilkan teks yang dikonversi ke penggunaan file yang berbeda
Anda dapat menginstalnya di Ubuntu atau Debian dengan
atau di macOS menggunakan homebrew
sumber
Masalah ini dapat diselesaikan dengan alat standar, tetapi ada cukup banyak perangkap untuk waspada yang saya sarankan Anda menginstal
flip
perintah, yang ditulis lebih dari 20 tahun yang lalu oleh Rahul Dhesi, penuliszoo
. Itu melakukan pekerjaan yang sangat baik untuk mengkonversi format file sementara, misalnya, menghindari penghancuran file biner yang tidak disengaja, yang agak terlalu mudah jika Anda hanya berlomba mengubah setiap CRLF yang Anda lihat ...sumber
Solusi yang diposting sejauh ini hanya menangani sebagian masalah, mengubah DOS / Windows CRLF menjadi LF Unix; bagian mereka hilang adalah bahwa DOS digunakan CRLF sebagai garis pemisah , sementara Unix menggunakan LF sebagai garis terminator . Perbedaannya adalah bahwa file DOS (biasanya) tidak akan memiliki apa pun setelah baris terakhir dalam file, sementara Unix akan. Untuk melakukan konversi dengan benar, Anda perlu menambahkan LF akhir itu (kecuali file tersebut panjangnya nol, artinya tidak ada baris sama sekali). Mantra favorit saya untuk ini (dengan sedikit logika ditambahkan untuk menangani file-file yang dipisahkan dengan CR gaya Mac, dan bukan file yang dianiaya yang sudah dalam format unix) sedikit perl:
Perhatikan bahwa ini mengirimkan versi Unixified file ke stdout. Jika Anda ingin mengganti file dengan versi Unixified, tambahkan
-i
bendera perl .sumber
Jika Anda tidak memiliki akses ke dos2unix , tetapi dapat membaca halaman ini, maka Anda dapat menyalin / menempelkan dos2unix.py dari sini.
Diposting silang dari superuser .
sumber
dos2unix
mengkonversi semua file input secara default. Penggunaan Anda menyiratkan-n
parameter. Dan sebenarnyados2unix
adalah filter yang membaca dari stdin, menulis ke stdout jika file tidak diberikan.Super duper mudah dengan PCRE;
Sebagai skrip, atau ganti
$@
dengan file Anda.sumber
--
. Saya memilih solusi ini karena mudah dimengerti dan beradaptasi untuk saya. FYI, inilah yang dilakukan oleh switch:-p
menganggap loop "selagi input",-i
edit file input pada tempatnya,-e
jalankan perintah berikutSolusi awk yang lebih sederhana dengan program:
Secara teknis '1' adalah program Anda, b / c awk memerlukannya ketika diberikan opsi.
UPDATE : Setelah meninjau kembali halaman ini untuk pertama kalinya dalam waktu yang lama, saya menyadari bahwa belum ada yang memposting solusi internal, jadi ini dia:
sumber
awk -v RS='\r\n' '1' dos.txt > unix.txt
awk
ataused
solusi. Selain itu, Anda harus menggunakanwhile IFS= read -r line
untuk menjaga jalur input dengan setia, jika tidak spasi spasi awal dan akhir tidak terpotong (atau gunakan nama variabel dalamread
perintah dan bekerjalah$REPLY
).Baru saja merenungkan pertanyaan yang sama (di sisi Windows, tetapi sama-sama berlaku untuk linux.) Ternyata tidak ada yang menyebutkan cara otomatis melakukan konversi CRLF <-> LF untuk file teks menggunakan
zip -ll
opsi lama yang baik (Info-ZIP):CATATAN: ini akan membuat file zip mempertahankan nama file asli tetapi mengubah akhir baris ke LF. Kemudian
unzip
akan mengekstrak file sebagai zip'ed, yaitu dengan nama asli mereka (tetapi dengan akhiran LF), sehingga mendorong untuk menimpa file asli lokal jika ada.Kutipan yang relevan dari
zip --help
:sumber
yang menarik di git-bash saya di windows sudah
sed ""
melakukan trik:Dugaan saya adalah bahwa sed mengabaikannya ketika membaca baris dari input dan selalu menulis akhiran baris unix pada output.
sumber
Ini berhasil untuk saya
sumber
Untuk Mac osx jika Anda telah menginstal homebrew [ http://brew.sh/[[1]
Pastikan Anda telah membuat salinan file, karena perintah ini akan mengubah file yang ada. Opsi -c mac membuat switch menjadi kompatibel dengan osx.
sumber
-c mac
, yang untuk mengubah pra-OS XCR
-hanya baris baru. Anda ingin menggunakan mode itu hanya untuk file ke dan dari Mac OS 9 atau sebelumnya.TIMTOWTDI!
Berdasarkan @GordonDavisson
Seseorang harus mempertimbangkan kemungkinan
[noeol]
...sumber
Anda bisa menggunakan awk. Setel pemisah rekaman (
RS
) ke regexp yang cocok dengan semua karakter baris baru, atau karakter. Dan mengatur pemisah catatan keluaran (ORS
) ke karakter baris baru unix-style.sumber
git diff
show ^ M, diedit dalam vim)Di Linux, mudah untuk mengonversi ^ M (ctrl-M) ke * nix newlines (^ J) dengan sed.
Ini akan seperti ini pada CLI, sebenarnya akan ada baris di teks. Namun, \ melewati itu untuk:
Anda mendapatkan ini dengan menggunakan ^ V (ctrl-V), ^ M (ctrl-M) dan \ (backslash) saat Anda mengetik:
sumber
Karena pertanyaan menyebutkan sed, ini adalah cara paling lurus ke depan untuk menggunakan sed untuk mencapai ini. Apa yang dikatakan ekspresi adalah ganti semua carriage-return dan line-feed dengan hanya line-feed saja. Itulah yang Anda butuhkan saat Anda beralih dari Windows ke Unix. Saya memverifikasi itu berfungsi.
sumber
Sebagai ekstensi untuk solusi Jonathan Unix to DOS dari Jonathan Leffler, untuk secara aman mengkonversi ke DOS ketika Anda tidak yakin dengan akhiran baris file saat ini:
Ini memeriksa bahwa saluran belum berakhir di CRLF sebelum mengkonversi ke CRLF.
sumber
Saya membuat skrip berdasarkan jawaban yang diterima sehingga Anda dapat mengonversinya secara langsung tanpa memerlukan file tambahan pada akhirnya dan menghapus serta mengganti nama sesudahnya.
pastikan saja jika Anda memiliki file seperti "file1.txt" yang "file1.txt2" belum ada atau akan ditimpa, saya menggunakan ini sebagai tempat sementara untuk menyimpan file.
sumber
Dengan bash 4.2 dan yang lebih baru, Anda dapat menggunakan sesuatu seperti ini untuk menghapus CR trailing, yang hanya menggunakan bash built-in:
sumber
Saya mencoba sed 's / ^ M $ //' file.txt di OSX serta beberapa metode lain ( http://www.thingy-ma-jig.co.uk/blog/25-11-2010/fixing- dos-line-endings atau http://hintsforums.macworld.com/archive/index.php/t-125.html ). Tidak ada yang berhasil, file tetap tidak berubah (btw Ctrl-v Enter diperlukan untuk mereproduksi ^ M). Pada akhirnya saya menggunakan TextWrangler. Ini bukan perintah baris tetapi bekerja dan tidak mengeluh.
sumber