Konversikan CRLF ke umpan baris di Linux

34

Apa cara terbaik untuk mengonversi CRLF ke umpan baris dalam file di Linux?

Saya telah melihat perintah sed , tetapi adakah yang lebih sederhana?

JoelFan
sumber
4
Dupe: superuser.com/questions/38744/… . Tautan yang disediakan dalam jawaban yang diterima mencakup antara lain opsi dos2unix, perl dan vi.
nagul
2
Ini sudah memiliki jawaban yang lebih baik (jadi jika salah satu dari ini akan ditutup, mungkin yang itu)
Jonik

Jawaban:

40

Gunakan perintah ini:

fromdos yourtextfile

Sebaliknya:

todos yourtextfile

Perintah-perintah ini ditemukan dalam paket tofrodos (pada distribusi terbaru), yang juga menyediakan dua pembungkus unix2dos dan dos2unix yang meniru alat unix lama dengan nama yang sama.

avelldiroll
sumber
2
+1 Jauh lebih berguna daripada jawaban "Gunakan dos2unix" yang saat ini terpilih.
Jonik
1
Ya, bahkan saya memilih ini. Milik saya lebih dari saran drive-by.
Ryan C. Thompson
Saya akan memberikan bonus tambahan jika Anda mengatakan bagaimana membuatnya rekursif. Saat ini hanya berfungsi dengan wildcard.
Sorin
2
@SorinSbarnea: sesuatu sepertifind . -name '*.txt' -print0 | xargs -null fromdos
bstpierre
@Jonik apa yang membuatnya "Jauh lebih berguna"? Pertanyaan serius
andrewtweber
24

Gunakan dos2unix.

dos2unix - Konverter format file teks DOS / MAC ke UNIX

dos2unix  [options] [-c convmode] [-o file ...] [-n infile outfile ...]

Options:
          [-hkqV] [--help] [--keepdate] [--quiet] [--version]
Ryan C. Thompson
sumber
2
dan unix2dos untuk sebaliknya.
Quack quixote
Dukun, apakah Anda mengikuti saya? Bukannya saya tidak menghargainya, dengan semua upvotes.
Ryan C. Thompson
1
Bung, aku ~ dukun. ucapkan "~" sebagai "tidak". :) tetapi tidak, tidak mengikuti Anda, tampaknya saya sering bertemu Anda.
Quack quixote
1
Pertimbangkan untuk menguraikan cara mendapatkan utilitas ini untuk sistem Linux Anda. Setidaknya di Ubuntu itu tidak diinstal secara default (tetapi dengan menginstal paket tofrodos Anda mendapatkan sesuatu yang sangat mirip: packages.ubuntu.com/jaunty/tofrodos ).
Jonik
20

Saya lebih suka perl :

perl -lne 's/\r//g; print' winfile.txt > unixfile.txt

Tapi itu sangat cocok untuk kegunaan saya, dan sangat mudah bagi saya untuk mengingatnya. Tidak semua sistem memiliki perintah dos2unix, tetapi sebagian besar yang saya kerjakan memiliki penerjemah perl.

Lainnya adalah recode , pengganti yang kuat untuk dos2unix dan iconv; itu tersedia dalam paket "recode" di repositori Debian:

recode ibmpc..lat1 winfile.txt   # dos2unix
recode lat1..ibmpc unixfile.txt  # unix2dos

Untuk penggemar awk :

awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt

... dan sed :

sed 's/\r$//' winfile.txt > unixfile.txt

Dan sekarang, hanya sedikit lebih sedikit berbelit-belit daripada menghapus CR dengan tangan di hex editor, langsung dari salah satu teman stackoverflow.com kami , dapat digunakan dengan juru bahasa daging sapi (terletak di repositori Debian lingkungan yang ramah),

dos2unix di brainfuck !

,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.

terima kasih banyak kepada jk karena telah menghabiskan satu jam hidupnya untuk menulis ini!

quack quixote
sumber
1
(Penggunaan kucing dan tidak berguna) perl sama rumitnya dengan ... jadi Anda tidak benar-benar menjawab pertanyaan melainkan mengumpulkan reputasi :)
akira
2
"cara terbaik" adalah subyektif. ini bekerja paling baik untuk saya (saya lebih nyaman dengan perl daripada sed). Saya tidak berjanji itu akan bekerja terbaik untuk Anda.
Quack quixote
@ akira: sebuah pertanyaan dapat memiliki beberapa jawaban yang valid. Saya menggunakan metode ini juga, kadang-kadang, sebagian besar dalam kombinasi dengan perubahan lain, jadi ini pasti jawaban yang valid; tetapi "gunakan dos2unix" jelas merupakan jawaban yang lebih praktis di sebagian besar situasi. Jadi saya pikir peringkatnya baik-baik saja.
reinierpost
@akira: jika Anda merasa lebih mudah, kirimkan sebagai jawaban dan jelaskan kepada kami semua.
Quack quixote
@ ~ dukun: itu intinya: itu tidak sederhana. itu sama untuk jawaban perl Anda. u2d atau fromdos / todos adalah jawaban yang tepat karena mereka lebih sederhana daripada hal-hal yang diungkapkan dalam bahasa pemrograman lain.
akira
9

Saya melakukan ini di Bash :

cat cr_stuffed.file | tr -d \r > no_more_crs.file
JustJeff
sumber
bagus. Saya melihat penyebutan tr sebelumnya hari ini. ini bukan program yang sering disebutkan, bukan?
Quack quixote
7

Saya pikir Anda dapat menggunakan tr, juga (meskipun saya tidak punya file format lucu yang bisa dicoba):

tr -d '\r' < file1 > file2
warren
sumber
4

In vi atau Vim :

:%s/^V^M//g
fpmurphy
sumber
4

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

tekan Ctrl + O untuk menyimpan, tetapi sebelum menekan Enter tekan: Alt + D untuk beralih antara akhir baris DOS dan Unix / Linux, atau: Alt + M untuk beralih antara Mac dan akhir baris Linux Unix / Linux lalu tekan Enter untuk menyimpan dan Ctrl + X untuk keluar.

Stefan Sjöberg
sumber
1
Bisakah Anda mengedit jawaban Anda untuk memperjelas pengaturan beralih mana yang akan mereplikasi perilaku yang diminta oleh OP?
Burgi
OP ingin mematikan akhir baris DOS, jadi Alt+d. Terkadang alt dicegat oleh program terminal, jadi Anda bisa menggunakannya esc+d.
spinup
1
Banyak cara pintas nano juga berfungsi dengan tombol Shift, yang sering mencegah intersepsi terminal, jadi 'Alt-Shift-D' juga berfungsi.
mwfearnley
3

Saya lebih suka Vim dan :set fileformat=unix. Meskipun bukan yang tercepat, itu memberi saya pratinjau. Ini sangat berguna dalam kasus file dengan akhiran campuran.

opello
sumber
1

Jika Anda menginginkan metode GUI, coba editor teks Kate (editor teks tingkat lanjut lainnya mungkin dapat menangani ini juga). Buka dialog temukan / Ganti ( Ctrl+ R), dan ganti \r\ndengan \n. (NB: Anda harus memilih "Ekspresi reguler" dari tarik turun dan batalkan pilihan "Pilihan saja" dari opsi.)

EDIT: Atau, jika Anda hanya ingin mengkonversi ke format Unix, kemudian gunakan pilihan menu Tools> End of Line> Unix.

DisgruntledGoat
sumber
Ada editor teks, seperti jEdit, yang dapat melakukan transformasi ini secara otomatis - Anda cukup memberi tahu jika Anda menginginkan pemisah garis Unix, Windows atau Mac.
Jonik
Sebenarnya, KATE juga bisa melakukannya melalui menu Tools> End of Line . Mungkin saya seharusnya berpikir lebih lambat daripada menjawab pertanyaan persis seperti apa yang dikatakan - tetapi jika Anda tahu Anda secara spesifik ingin mengonversi \r\nuntuk \nkemudian menggunakan pencarian / ganti lebih mudah daripada mengingat OS mana yang menggunakan baris yang berakhiran. ;)
DisgruntledGoat
1

Rekatkan ini ke skrip Python dos2unix.py .

#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys

if len(sys.argv[1:]) != 2:
  sys.exit(__doc__)

content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
  content = infile.read()
with open(sys.argv[2], 'wb') as output:
  for line in content.splitlines():
    outsize += len(line) + 1
    output.write(line + '\n')

print("Done. Saved %s bytes." % (len(content)-outsize))

Harus bekerja pada platform apa pun dengan Python diinstal. Area publik.

techtonik anatoly
sumber
1

CR LFuntuk LFmenggunakan awk :

awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename

Contoh penggunaan:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C

Penjelasan:

-v RS='\r?\n'mengatur variabel RS ( input r ecord s eparator) menjadi \r?\n, artinya input dibaca baris demi baris dipisahkan oleh LF ( \n) yang dapat ( ?) didahului oleh CR ( \r).

1adalah script awk dieksekusi. Sebuah skrip terdiri dari condition { action }. Dalam hal ini, 1adalah kondisi yang bernilai true. Tindakan dihilangkan, sehingga tindakan default dijalankan, yang berarti mencetak baris saat ini (yang juga bisa ditulis sebagai {print $0}atau hanya {print}).


LFke CR LF: Anda dapat mengatur variabel ORS( eparator r ecord s o utput ) untuk memodifikasi garis akhir dari output. Contoh:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C
Martin
sumber
0

Saya menggunakan skrip ini untuk file yang saya perlukan untuk mentransfer file darurat dari sistem windows ke sistem unix.

 find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix

find . -type f

Temukan semua file, secara rekursif di direktori tempat Anda menjalankan perintah

xargs file

Lulus ke program file untuk mendapatkan analisis file.

grep CRLF

Kami hanya ingin output file yang menunjukkan CRLF.

cut -d: -f1

Dapatkan output hingga ke warna. buang sisanya. Kami seharusnya hanya memiliki nama file sekarang

xargs dos2unix

Berikan nama file ke dos2unix program menggunakan xargs .

Tschallacka
sumber