Chuyển đổi định dạng dòng mới từ Mac sang Windows


133

Tôi cần một tiện ích / tập lệnh chuyển đổi sẽ chuyển đổi tệp kết xuất .sql được tạo trên Mac thành một tệp có thể đọc được trên Windows. Đây là sự tiếp nối của một vấn đề tôi đã có ở đây . Vấn đề dường như là do định dạng dòng mới trong các tệp văn bản, nhưng tôi không thể tìm thấy một công cụ để thực hiện chuyển đổi ...


3
Một công cụ chung tôi đã thực hiện sau khi không tìm thấy bất kỳ giải pháp thỏa đáng nào với cường độ công nghiệp github.com/mdolidon/endlines
Mathias Dolidon

Câu trả lời:


134

Windows sử dụng carriage return+ line feedcho dòng mới:

\r\n

Unix chỉ sử dụng Line feedcho dòng mới:

\n

Tóm lại, chỉ đơn giản là thay thế tất cả các xuất hiện của \nbằng \r\n.
Cả hai unix2dosdos2unixkhông có mặc định có sẵn trên Mac OSX.
May mắn thay, bạn chỉ có thể sử dụng Perlhoặc sedđể thực hiện công việc:

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

Đoạn mã từ:
http://en.wikipedia.org/wiki/Newline#Conversion_utilities


36
Các sedlệnh cho UNIX để DOS không làm việc cho tôi trên OS X Lion - nó chỉ chèn dòng chữ "r" vào cuối mỗi dòng. Các perllệnh làm việc mặc dù.
Ergwun

7
OSX sử dụng phiên bản cũ hơn của sed. Tôi sử dụng Homebrew cho OSX và cài đặt gnu-sed. Bạn sử dụng với lệnh "gsed" thay vì "sed". Điều đó làm việc.
Giăng

2
Sử dụng Homebrew để nhận các gói dos2unix và unix2dos thay thế.
Pratyush

10
OS X Yosemite vẫn có cùng một vấn đề sed, nhưng bạn có thể làm việc xung quanh nó mà không cần cài đặt Homebrew, gnu-sed hoặc unix2dos: Sử dụng sed -e 's/$/^M/' inputfile > outputfile, ^Mmột ký tự điều khiển được tạo trên dòng lệnh thông qua Ctrl+V Ctrl+M.
LarsH

2
Một cách giải quyết khác cho Mac OS (đã được thử nghiệm trên 10.13.6 High Sierra): Đặt a $trước trích dẫn duy nhất có chứa lệnh sed: sed $'s/\r$//'Giải thích: bash giải mã dấu gạch chéo ngược trong $'...'chuỗi. Xem gnu.org/software/bash/manual/html_node/ANSI_002dC-Quote.html để biết chi tiết.
jcsahnwaldt phục hồi Monica

127

Đây là phiên bản cải tiến của câu trả lời của Anne - nếu bạn sử dụng perl, bạn có thể thực hiện chỉnh sửa trên tệp 'tại chỗ' thay vì tạo tệp mới:

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

5
Điều tuyệt vời của các tập lệnh này là chúng hiển thị, với các biểu thức chính quy, CHÍNH XÁC những gì chuyển đổi cuối dòng cần phải được chuyển đổi sang định dạng, bắt đầu từ bất cứ điều gì.
pbr

hãy cẩn thận với điều này trên một số cài đặt Cygwin / git bash trên các hệ thống Windows. Điều này có thể cung cấp cho bạn Can't do inplace edit on file: Permission denied., và xóa các tập tin. Nhìn vào các tiện ích khác thay thế.
Dennis

Cảm ơn rất nhiều vì đã hiển thị "Chuyển đổi sang Unix". Tôi đã theo cách đó và câu trả lời kép của bạn đã giúp tôi, và nhận được sự ủng hộ của tôi.
null

112

Bạn có thể cài đặt unix2dos với Homebrew

brew install unix2dos

Sau đó, bạn có thể làm điều này:

unix2dos file-to-convert

Bạn cũng có thể chuyển đổi tập tin dos thành unix:

dos2unix file-to-convert

9
Đối với bất kỳ ai bắt gặp điều này bây giờ, công thức Homebrew bây giờ được gọi dos2unix. Bạn sẽ muốn brew install dos2unix.
Geoff

13
Trên thực tế, một trong hai brew install unix2doshoặc brew install dos2unixlàm việc tốt. Họ cài đặt cùng một gói. Sử dụng tên nào sẽ nói với bạn :)
Steven Hirlston

2
Hoặc với Macports : port install dos2unix.
Fang

16

Bạn có thể muốn 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.

Bạn có thể chạy unix2dostrên máy DOS / Windows của mình bằng cygwin hoặc trên máy Mac bằng MacPorts .


unix2dos / dos2unix không tồn tại trên máy mac của tôi và tôi không tìm thấy nơi nào để cài đặt chúng- Bạn có biết cái nào không?
Yarin

@mgadda: +1 - vâng, tôi đã chuyển sang homebrew từ MacPorts một lúc rồi và không nhìn lại.
Paul R

15

Chỉ cần trxóa:

tr -d "\r" <infile.txt >outfile.txt

1
Đã thử perl và sed, không hoạt động (tôi có thể hiểu ra, không đáng để thử). Điều này đã làm việc tuyệt vời.
RandomInsano

Đây là giải pháp đầu tiên tôi tìm thấy cho các số dòng của BBEdit không khớp với số dòng khi tôi đọc chúng bằng Python (và không khớp wc -l).
Daryl Spitzer

1
việc này sẽ xóa tất cả các ngắt dòng Tôi thực sự vẫn cần phải ngắt dòng nhưng với \ n
UserYmY

" gợi ý.macworld.com/article.php?story=20031018164326986 " cũng có một bài viết tốt về cách sử dụng trlệnh để thực hiện các chuyển đổi khác nhau. Sử dụng hexdumphoặc tương tự để tìm hiểu chính xác loại quy ước cuối dòng nào được sử dụng trong tệp.
Mike Robinson

6
  1. Cài đặt dos2unix với homebrew
  2. Chạy find ./ -type f -exec dos2unix {} \;để chuyển đổi đệ quy tất cả các kết thúc dòng trong thư mục hiện tại

2

vimcũng có thể chuyển đổi tập tin từ định dạng UNIX sang DOS. Ví dụ:

vim hello.txt <<EOF
:set fileformat=dos
:wq
EOF

2

Sau đây là tập lệnh hoàn chỉnh dựa trên các câu trả lời ở trên cùng với kiểm tra độ tỉnh táo và hoạt động trên Mac OS X và cũng sẽ hoạt động trên các hệ thống Linux / Unix khác (mặc dù điều này chưa được thử nghiệm).

#!/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

1

Đây là một cách tiếp cận thực sự đơn giản, phù hợp với tôi, với Weblog của Davy Schmeits :

cat foo | col -b > foo2

Trong đó foo là tệp có các ký tự Control + M ở cuối dòng và foo2 tệp mới mà bạn đang tạo.


0

Trên Yosemite OSX, sử dụng lệnh này:

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

trong đó ^Mtrình tự đạt được bằng cách nhấn Ctrl+ Vsau đó Enter.


Cũng lưu ý rằng sed không hiểu các dấu gạch chéo ngược như \rvà `` \ n` và do đó cũng có thể sử dụng các thay thế này. Bạn thực sự không phải nhập một điều khiển theo nghĩa đen-M để chỉ ký tự đó (hoặc bất kỳ ký tự nào khác). Nguyên tắc sử dụng sed(và -i) để thực hiện bất kỳ loại chuyển đổi nào thuộc loại này là rất tốt, bởi vì, không giống như tr, bạn không bị giới hạn ở "một ký tự tại một thời điểm".
Mike Robinson

0

Mở rộng câu trả lời của Anne và JosephH, sử dụng perl trong một tập lệnh perl ngắn, vì tôi quá lười để gõ perl-one-liner rất nhiều thời gian.
Tạo một tệp, được đặt tên ví dụ "unix2dos.pl" và đặt nó vào một thư mục trong đường dẫn của bạn. Chỉnh sửa tập tin để chứa 2 dòng:

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

Giả sử rằng "mà perl" trả về "/ usr / bin / perl" trên hệ thống của bạn. Làm cho tập tin thực thi (chmod u + x unix2dos.pl).

Ví dụ:
$ echo "hello"> xxx
$ od -c xxx (kiểm tra xem tệp kết thúc bằng nl)
0000000 xin chào \ n

$ unix2dos.pl xxx
$ od -c xxx (kiểm tra xem bây giờ kết thúc bằng cr lf)
0000000 xin chào \ r \ n


0

Trong Xcode 9 trong bảng điều khiển bên trái mở / chọn tệp của bạn trong trình điều hướng dự án . Nếu không có tập tin, thuốc và thả nó vào bộ điều hướng dự án .

Trên bảng bên phải, tìm Cài đặt văn bản và thay đổi Kết thúc dòng thành Windows (CRLF) .

Xáo trộn XCodescreendump từ XCode

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.