Mengonversi pemformatan baris baru dari Mac ke Windows

133

Saya memerlukan utilitas konversi / skrip yang akan mengkonversi file dump .sql yang dihasilkan pada Mac menjadi satu yang dapat dibaca di Windows. Ini adalah kelanjutan dari masalah yang saya miliki di sini . Masalahnya tampaknya dengan pemformatan baris baru dalam file teks, tetapi saya tidak dapat menemukan alat untuk membuat konversi ...

Yarin
sumber
3
Alat generik yang saya buat setelah tidak menemukan solusi yang memuaskan dengan kekuatan industri github.com/mdolidon/endlines
Mathias Dolidon

Jawaban:

134

Windows menggunakan carriage return+ line feeduntuk baris baru:

\r\n

Unix hanya menggunakan Line feeduntuk baris baru:

\n

Sebagai kesimpulan, cukup ganti setiap kejadian \ndengan \r\n.
Keduanya unix2dosdan dos2unixtidak secara default tersedia di Mac OSX.
Untungnya, Anda cukup menggunakan Perlatau sedmelakukan pekerjaan itu:

sed -e 's/$/\r/' inputfile > outputfile                # UNIX to DOS  (adding CRs)
sed -e 's/\r$//' inputfile > outputfile                # DOS  to UNIX (removing CRs)
perl -pe 's/\r\n|\n|\r/\r\n/g' inputfile > outputfile  # Convert to DOS
perl -pe 's/\r\n|\n|\r/\n/g'   inputfile > outputfile  # Convert to UNIX
perl -pe 's/\r\n|\n|\r/\r/g'   inputfile > outputfile  # Convert to old Mac

Cuplikan kode dari:
http://en.wikipedia.org/wiki/Newline#Conversion_utilities

Anne
sumber
36
The sedperintah untuk UNIX ke DOS tidak bekerja untuk saya pada OS X Lion - itu hanya menyisipkan teks "r" pada akhir setiap baris. The perlperintah bekerja sekalipun.
Ergwun
7
OSX menggunakan versi sed yang lebih lama. Saya menggunakan Homebrew untuk OSX, dan menginstal gnu-sed. Anda menggunakan dengan perintah "gsed" bukannya "sed". Itu bekerja.
John
2
Gunakan Homebrew untuk mendapatkan paket dos2unix dan unix2dos sebagai gantinya.
Pratyush
10
OS X Yosemite masih memiliki masalah yang sama dengan sed, tetapi Anda dapat mengatasinya tanpa menginstal Homebrew, gnu-sed atau unix2dos: Gunakan sed -e 's/$/^M/' inputfile > outputfile, di mana ^Mkarakter kontrol dihasilkan pada baris perintah via Ctrl+V Ctrl+M.
LarsH
2
Solusi lain untuk Mac OS (diuji pada 10.13.6 High Sierra): Tempatkan $sebelum tanda kutip tunggal yang berisi perintah sed: sed $'s/\r$//'Penjelasan: bash menerjemahkan backslash-escapes dalam $'...'string. Lihat gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html untuk detailnya.
jcsahnwaldt Reinstate Monica
127

Ini adalah versi perbaikan dari jawaban Anne - jika Anda menggunakan perl, Anda dapat melakukan pengeditan pada file 'in-place' daripada membuat file baru:

perl -pi -e 's/\r\n|\n|\r/\r\n/g' file-to-convert  # Convert to DOS
perl -pi -e 's/\r\n|\n|\r/\n/g'   file-to-convert  # Convert to UNIX
JosephH
sumber
5
Hal yang luar biasa tentang skrip ini adalah bahwa mereka menunjukkan, dengan ekspresi reguler, PERSIS apa yang perlu konversi akhir baris untuk mengkonversi ke salah satu format, mulai dari apa pun.
pbr
hati-hati dengan ini pada instalasi bash Cygwin / git tertentu pada sistem Windows. Ini mungkin memberi Anda Can't do inplace edit on file: Permission denied., dan menghapus file. Lihatlah ke utilitas lain sebagai gantinya.
Dennis
Terima kasih banyak untuk menunjukkan "Konversi ke Unix". Saya mengincar seperti itu dan jawaban ganda Anda membantu saya, dan mendapat dukungan saya.
null
112

Anda dapat menginstal unix2dos dengan Homebrew

brew install unix2dos

Maka Anda dapat melakukan ini:

unix2dos file-to-convert

Anda juga dapat mengonversi file dos ke unix:

dos2unix file-to-convert
Steven Hirlston
sumber
9
Bagi siapa pun yang menemukan ini sekarang, rumus Homebrew sekarang disebut dos2unix. Anda pasti mau brew install dos2unix.
Geoff
13
Sebenarnya, baik brew install unix2dosatau brew install dos2unixberfungsi dengan baik. Mereka menginstal paket yang sama. Gunakan nama mana saja yang berbicara kepada Anda :)
Steven Hirlston
2
Atau dengan Macports : port install dos2unix.
Fang
16

Anda mungkin ingin unix2dos :

$ man unix2dos

NAME
       dos2unix - DOS/MAC to UNIX and vice versa text file format converter

SYNOPSIS
           dos2unix [options] [-c CONVMODE] [-o FILE ...] [-n INFILE OUTFILE ...]
           unix2dos [options] [-c CONVMODE] [-o FILE ...] [-n INFILE OUTFILE ...]

DESCRIPTION
       The Dos2unix package includes utilities "dos2unix" and "unix2dos" to convert plain text files in DOS or MAC format to UNIX format and vice versa.  Binary files and non-
       regular files, such as soft links, are automatically skipped, unless conversion is forced.

       Dos2unix has a few conversion modes similar to dos2unix under SunOS/Solaris.

       In DOS/Windows text files line endings exist out of a combination of two characters: a Carriage Return (CR) followed by a Line Feed (LF).  In Unix text files line
       endings exists out of a single Newline character which is equal to a DOS Line Feed (LF) character.  In Mac text files, prior to Mac OS X, line endings exist out of a
       single Carriage Return character. Mac OS X is Unix based and has the same line endings as Unix.

Anda dapat menjalankan unix2dosmesin DOS / Windows menggunakan cygwin atau di Mac menggunakan MacPorts .

Paul R
sumber
unix2dos / dos2unix tidak ada di mac saya dan saya belum menemukan tempat untuk menginstalnya- Apakah Anda tahu?
Yarin
@mgadda: +1 - ya, saya beralih ke homebrew dari MacPorts beberapa waktu lalu dan belum melihat ke belakang.
Paul R
15

Hanya melakukan trdelete:

tr -d "\r" <infile.txt >outfile.txt
parahren
sumber
1
Mencoba perl dan sed, tidak berhasil (saya bisa mengetahuinya, tidak patut dicoba). Ini bekerja dengan baik.
RandomInsano
Ini adalah solusi pertama yang saya temukan pada nomor baris BBEdit yang tidak cocok dengan jumlah baris ketika saya membacanya menggunakan Python (dan tidak cocok wc -l).
Daryl Spitzer
1
ini menghapus semua jeda baris saya sebenarnya masih perlu memiliki jeda baris tetapi dengan \ n
UserYmY
" hints.macworld.com/article.php?story=20031018164326986 " juga memiliki tulisan yang bagus tentang cara menggunakan trperintah untuk melakukan berbagai konversi. Gunakan hexdumpatau serupa untuk mencari tahu konvensi seperti apa end-of-line sekarang digunakan dalam file.
Mike Robinson
6
  1. Instal dos2unix dengan homebrew
  2. Jalankan find ./ -type f -exec dos2unix {} \;untuk secara rekursif mengubah semua akhir baris dalam folder saat ini
Tidak
sumber
2

vimjuga dapat mengkonversi file dari format UNIX ke DOS. Sebagai contoh:

vim hello.txt <<EOF
:set fileformat=dos
:wq
EOF
Stephen Quan
sumber
2

Berikut ini adalah skrip lengkap berdasarkan jawaban di atas bersama dengan pemeriksaan kewarasan dan bekerja pada Mac OS X dan harus bekerja pada sistem Linux / Unix lain juga (meskipun ini belum diuji).

#!/bin/bash

# http://stackoverflow.com/questions/6373888/converting-newline-formatting-from-mac-to-windows

# =============================================================================
# =
# = FIXTEXT.SH by ECJB
# =
# = USAGE:  SCRIPT [ MODE ] FILENAME
# =
# = MODE is one of unix2dos, dos2unix, tounix, todos, tomac
# = FILENAME is modified in-place
# = If SCRIPT is one of the modes (with or without .sh extension), then MODE
# =   can be omitted - it is inferred from the script name.
# = The script does use the file command to test if it is a text file or not,
# =   but this is not a guarantee.
# =
# =============================================================================

clear
script="$0"
modes="unix2dos dos2unix todos tounix tomac"

usage() {
    echo "USAGE:  $script [ mode ] filename"
    echo
    echo "MODE is one of:"
    echo $modes
    echo "NOTE:  The tomac mode is intended for old Mac OS versions and should not be"
    echo "used without good reason."
    echo
    echo "The file is modified in-place so there is no output filename."
    echo "USE AT YOUR OWN RISK."
    echo
    echo "The script does try to check if it's a binary or text file for sanity, but"
    echo "this is not guaranteed."
    echo
    echo "Symbolic links to this script may use the above names and be recognized as"
    echo "mode operators."
    echo
    echo "Press RETURN to exit."
    read answer
    exit
}

# -- Look for the mode as the scriptname
mode="`basename "$0" .sh`"
fname="$1"

# -- If 2 arguments use as mode and filename
if [ ! -z "$2" ] ; then mode="$1"; fname="$2"; fi

# -- Check there are 1 or 2 arguments or print usage.
if [ ! -z "$3" -o -z "$1" ] ; then usage; fi

# -- Check if the mode found is valid.
validmode=no
for checkmode in $modes; do if [ $mode = $checkmode ] ; then validmode=yes; fi; done
# -- If not a valid mode, abort.
if [ $validmode = no ] ; then echo Invalid mode $mode...aborting.; echo; usage; fi

# -- If the file doesn't exist, abort.
if [ ! -e "$fname" ] ; then echo Input file $fname does not exist...aborting.; echo; usage; fi

# -- If the OS thinks it's a binary file, abort, displaying file information.
if [ -z "`file "$fname" | grep text`" ] ; then echo Input file $fname may be a binary file...aborting.; echo; file "$fname"; echo; usage; fi

# -- Do the in-place conversion.
case "$mode" in
#   unix2dos ) # sed does not behave on Mac - replace w/ "todos" and "tounix"
#       # Plus, these variants are more universal and assume less.
#       sed -e 's/$/\r/' -i '' "$fname"             # UNIX to DOS  (adding CRs)
#       ;;
#   dos2unix )
#       sed -e 's/\r$//' -i '' "$fname"             # DOS  to UNIX (removing CRs)
#           ;;
    "unix2dos" | "todos" )
        perl -pi -e 's/\r\n|\n|\r/\r\n/g' "$fname"  # Convert to DOS
        ;;
    "dos2unix" | "tounix" )
        perl -pi -e 's/\r\n|\n|\r/\n/g'   "$fname"  # Convert to UNIX
        ;;
    "tomac" )
        perl -pi -e 's/\r\n|\n|\r/\r/g'   "$fname"  # Convert to old Mac
        ;;
    * ) # -- Not strictly needed since mode is checked first.
        echo Invalid mode $mode...aborting.; echo; usage
        ;;
esac

# -- Display result.
if [ "$?" = "0" ] ; then echo "File $fname updated with mode $mode."; else echo "Conversion failed return code $?."; echo; usage; fi
ECJB
sumber
1

Inilah pendekatan yang sangat sederhana, bekerja dengan baik untuk saya, dengan hormat dari Davy Schmeits's Weblog :

cat foo | col -b > foo2

Di mana foo adalah file yang memiliki karakter Control + M di akhir baris, dan foo2 file baru yang Anda buat.

pengembangan
sumber
0

Di Yosemite OSX, gunakan perintah ini:

sed -e 's/^M$//' -i '' filename

di mana ^Murutan dicapai dengan menekan Ctrl+ Vlalu Enter.

Olga
sumber
Juga perhatikan bahwa sed tidak memahami backslash-escapes seperti \rdan `` \ n` dan karena itu juga dapat menggunakannya dalam substitusi. Anda sebenarnya tidak harus memasukkan kontrol-M harfiah untuk merujuk ke karakter itu (atau yang lain). Prinsip menggunakan sed(dan -i) untuk melakukan konversi jenis apa pun adalah sangat bagus, karena, tidak seperti tr, Anda tidak terbatas pada "satu karakter pada satu waktu."
Mike Robinson
0

Memperluas jawaban Anne dan JosephH, menggunakan perl dalam skrip perl pendek, karena saya terlalu malas untuk mengetikkan perl-one-liner saat itu juga.
Buat file, beri nama misalnya "unix2dos.pl" dan letakkan di direktori di jalur Anda. Edit file untuk memuat 2 baris:

#!/usr/bin/perl -wpi
s/\n|\r\n/\r\n/g;

Dengan asumsi bahwa "perl yang" mengembalikan "/ usr / bin / perl" pada sistem Anda. Jadikan file tersebut dapat dieksekusi (chmod u + x unix2dos.pl).

Contoh:
$ echo "hello"> xxx
$ od -c xxx (memeriksa apakah file diakhiri dengan nl)
0000000 halo \ n

$ unix2dos.pl xxx
$ od -c xxx (memeriksa bahwa itu berakhir sekarang di cr lf)
0000000 halo \ r \ n

avy
sumber
0

Dalam Xcode 9 di panel kiri buka / pilih file Anda di navigator proyek . Jika file tidak ada, obat-dan-jatuhkan ke navigator proyek .

Di panel kanan temukan Pengaturan Teks dan ubah Line Endings ke Windows (CRLF) .

Screendump XCodescreendump dari XCode

matrix3003
sumber