Apa cara paling sederhana untuk menghapus semua pengembalian carriage \r
dari file di Unix?
unix
carriage-return
Aldur
sumber
sumber
Jawaban:
Aku akan menganggap Anda berarti tombol kembali ( CR,
"\r"
,0x0d
) di ujung garis bukan hanya membabi buta dalam file (Anda mungkin memiliki mereka di tengah-tengah string untuk semua aku tahu). Menggunakan file uji ini dengan hanya CRpada akhir baris pertama:dos2unix
adalah cara untuk pergi jika diinstal pada sistem Anda:Jika karena alasan tertentu
dos2unix
tidak tersedia untuk Anda, makased
akan melakukannya:Jika karena alasan tertentu
sed
tidak tersedia untuk Anda, makaed
akan melakukannya dengan cara yang rumit:Jika Anda tidak memiliki salah satu alat yang diinstal pada kotak Anda, Anda punya masalah lebih besar daripada mencoba mengonversi file :-)
sumber
\r
hanya bekerja dengan sed GNU, kalau tidak Anda bisa melakukan ini:sed `echo "s/\r//"`
sed
jugaecho
mengenali\r
di MacO. Dalam hal iniprintf "\r"
tampaknya hanya berfungsi.sed "s/$(printf '\r')\$//"
$
seperti ini:sed $'s@\r@@g' |od -c
(tetapi jika Anda akan menggantinya dengan\n
Anda perlu menghindarinya)CTRL-V + CTRL-M
di tempat\r
sepertinya akan bekerja.Lihat tr (1)
sumber
tr
tidak mendukung\r
pelarian, coba'\015'
atau mungkin secara literal'^M'
(dalam banyak shell pada banyak terminal, ctrl-V ctrl-M akan menghasilkan karakter ctrl-M literal).outfile = infile
?someProg <in >out && mv out in
.Sekolah tua:
sumber
Cara paling sederhana di Linux, menurut saya,
The kutipan yang kuat di sekitar operator substitusi
's/\r//'
yang penting . Tanpa mereka shell akan menafsirkan\r
sebagai pelarian + r dan menguranginya menjadi dataranr
, dan menghapus semua huruf kecilr
. Itu sebabnya jawaban yang diberikan di atas pada tahun 2009 oleh Rob tidak berhasil.Dan menambahkan
/g
pengubah memastikan bahwa banyak\r
pun akan dihapus, dan tidak hanya yang pertama.sumber
Ada utilitas bernama dos2unix yang ada di banyak sistem, dan dapat dengan mudah diinstal pada sebagian besar.
sumber
sed -i s/\r// <filename>
atau semacamnya; lihatman sed
atau kekayaan informasi yang tersedia di web mengenai penggunaansed
.Satu hal yang perlu diperhatikan adalah makna yang tepat dari "carriage return" di atas; jika Anda benar-benar bermaksud karakter kontrol tunggal "carriage return", maka pola di atas benar. Jika Anda maksudkan, secara lebih umum, CRLF (carriage return dan feed line, yang merupakan bagaimana feed line diimplementasikan di Windows), maka Anda mungkin ingin mengganti
\r\n
saja. Umpan baris baru (baris baru) di Linux / Unix adalah\n
.sumber
s/\r//
sepertinya tidak menghapus carriage return di OS X, tampaknya menghapusr
karakter literal sebagai gantinya. Saya belum yakin mengapa itu belum. Mungkin itu ada hubungannya dengan cara string dikutip? Sebagai solusinya, menggunakanCTRL-V + CTRL-M
di tempat\r
tampaknya berfungsi.Jika Anda adalah pengguna Vi, Anda dapat membuka file dan menghapus carriage return dengan:
atau dengan
Perhatikan bahwa Anda harus mengetikkan ^ M dengan menekan ctrl-v dan kemudian ctrl-m.
sumber
^M
-s sama sekali. Berkeliling ini adalah satu ton penekanan tombol, yang bukan untuk apa vim dibuat;). Saya hanya akan pergised -i
, dan kemudian `-e 's / \ r // //' untuk membatasi penghapusan untuk CRs di EOL.Sekali lagi solusi ... Karena selalu ada satu lagi:
Ini bagus karena sudah ada dan berfungsi dalam setiap rasa unix / linux yang pernah saya gunakan.
sumber
Orang lain merekomendasikan
dos2unix
dan saya sangat merekomendasikannya juga. Saya hanya memberikan lebih banyak detail.Jika terpasang, lompat ke langkah berikutnya. Jika belum diinstal, saya akan merekomendasikan menginstalnya melalui
yum
seperti:Maka Anda bisa menggunakannya seperti:
sumber
Jika Anda menggunakan OS (seperti OS X) yang tidak memiliki
dos2unix
perintah tetapi memang memiliki juru bahasa Python (versi 2.5+), perintah ini setara dengandos2unix
perintah:Ini menangani kedua file bernama pada baris perintah serta pipa dan pengalihan, sama seperti
dos2unix
. Jika Anda menambahkan baris ini ke file ~ / .bashrc Anda (atau file profil yang setara untuk shell lain):... saat berikutnya Anda masuk (atau menjalankan
source ~/.bashrc
sesi saat ini), Anda akan dapat menggunakandos2unix
nama pada baris perintah dengan cara yang sama seperti pada contoh lainnya.sumber
Ini masalahnya,
%0d
adalah karakter carriage return. Untuk membuatnya kompatibel dengan Unix. Kita perlu menggunakan perintah di bawah ini.dos2unix fileName.extension fileName.extension
sumber
coba ini untuk mengubah file dos menjadi file unix:
sumber
Untuk UNIX ... Saya perhatikan dos2unix menghapus header Unicode dari file UTF-8 saya. Di bawah git bash (Windows), skrip berikut tampaknya berfungsi dengan baik. Ini menggunakan sed. Perhatikan itu hanya menghilangkan carriage-return di ujung garis, dan mempertahankan header Unicode.
sumber
Jika Anda menjalankan lingkungan X dan memiliki editor yang tepat (kode studio visual), maka saya akan mengikuti rekomendasi ini:
Visual Studio Code: Cara menampilkan akhir baris
Pergi saja ke sudut kanan bawah layar Anda, kode studio visual akan menunjukkan kepada Anda baik pengkodean file dan konvensi akhir baris diikuti oleh file, hanya dengan klik sederhana Anda dapat beralih di sekitar.
Cukup gunakan kode visual sebagai pengganti notepad ++ di lingkungan linux dan Anda sudah siap.
sumber
Notepad++
perintah untukEdit / EOL Conversion / Unix (LF)
di sistem Windows Anda sebelum menyalin file ke sistem Linux Anda.Menghapus
\r
pada sistem UNIX® apa pun:Sebagian besar solusi yang ada dalam pertanyaan ini adalah khusus untuk GNU, dan tidak akan berfungsi pada OS X atau BSD; solusi di bawah ini akan bekerja pada lebih banyak sistem UNIX, dan dalam setiap shell, dari
tcsh
hinggash
, masih bekerja bahkan di GNU / Linux juga.Diuji pada OS X, OpenBSD dan NetBSD di
tcsh
, dan pada Debian GNU / Linux dibash
.Dengan
sed
:Di
tcsh
dalam OS X,sed
cuplikan berikut ini dapat digunakan bersama-sama denganprintf
, karena tidak adased
atauecho
menangani\r
dengan cara khusus seperti yang dilakukan GNU:Dengan
tr
:Pilihan lain adalah
tr
:Perbedaan antara
sed
dantr
:Akan muncul bahwa
tr
mempertahankan kurangnya baris tambahan dari file input, sedangkansed
pada OS X dan NetBSD (tetapi tidak pada OpenBSD atau GNU / Linux) menyisipkan baris tambahan di akhir file bahkan jika input tidak ada tertinggal\r
atau\n
di akhir file.Pengujian:
Berikut ini beberapa contoh pengujian yang dapat digunakan untuk memastikan ini berfungsi pada sistem Anda, menggunakan
printf
danhexdump -C
; atauod -c
dapat juga digunakan jika sistem Anda tidak adahexdump
:sumber
Saya telah menggunakan python untuk itu, ini kode saya;
sumber
Meskipun itu adalah posting yang lebih tua, baru-baru ini saya menemukan masalah yang sama. Karena saya memiliki semua file untuk diganti nama di dalam / tmp / blah_dir / karena setiap file dalam direktori ini memiliki "/ r" karakter trailing (menunjukkan "?" Di akhir file), jadi melakukannya dengan cara skrip hanya bisa saya pikirkan.
Saya ingin menyimpan file terakhir dengan nama yang sama (tanpa karakter apa pun). Dengan sed, masalahnya adalah nama file keluaran yang saya perlu menyebutkan sesuatu yang lain (yang saya tidak mau).
Saya mencoba opsi lain seperti yang disarankan di sini (tidak dianggap dos2unix karena beberapa keterbatasan) tetapi tidak berhasil.
Saya mencoba dengan "awk" akhirnya yang bekerja di mana saya menggunakan "\" sebagai pembatas dan mengambil bagian pertama :
triknya adalah:
Di bawah cuplikan skrip yang saya gunakan (di mana saya memiliki semua file memiliki "\ r" sebagai karakter tambahan di path / tmp / blah_dir /) untuk memperbaiki masalah saya:
Catatan: Contoh ini tidak terlalu tepat meskipun dekat dengan apa yang saya kerjakan (Sebutkan di sini hanya untuk memberikan ide yang lebih baik tentang apa yang saya lakukan)
sumber
Saya membuat skrip shell ini untuk menghapus karakter. Ia bekerja dalam solaris dan topi merah:
sumber
Anda cukup melakukan ini:
sumber
a * b
...