Mac에서 Windows로 줄 바꿈 형식 변환


133

Mac에서 생성 된 .sql 덤프 파일을 Windows에서 읽을 수있는 파일로 변환하는 변환 유틸리티 / 스크립트가 필요합니다. 이것은 내가 여기에 있었던 문제의 연속입니다 . 문제는 텍스트 파일의 줄 바꿈 형식과 관련이있는 것 같지만 변환 도구를 찾을 수 없습니다 ...


답변:


134

Windows는 개행에 carriage return+ line feed를 사용합니다 .

\r\n

유닉스는 Line feed개행 에만 사용 합니다.

\n

결론적으로 모든 발생을 \n로 대체하십시오 \r\n.
모두 unix2dosdos2unix맥 OSX에서 사용 가능한 기본으로하지 않습니다.
다행히 간단하게 Perl또는 sed작업을 수행 할 수 있습니다 .

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

http://en.wikipedia.org/wiki/Newline#Conversion_utilities의 코드 스 니펫


36
sedDOS에 UNIX에 대한 명령은 OS X 사자에 나를 위해 작동하지 않습니다 - 그것은 단지 각 줄의 끝에서 텍스트 "R"을 삽입한다. perl명령은 있지만 작동합니다.
Ergwun

7
OSX는 이전 버전의 sed를 사용합니다. OSX에 Homebrew를 사용하고 설치했습니다. "sed"대신 "gsed"명령과 함께 사용합니다. 작동합니다.
John

2
대신 Homebrew를 사용하여 dos2unix 및 unix2dos 패키지를 가져 오십시오.
Pratyush

10
OS X Yosemite는 여전히 같은 문제를 가지고 sed있지만 Homebrew, gnu-sed 또는 unix2dos : Use를 설치하지 않고도이 문제를 해결할 수 있습니다. sed -e 's/$/^M/' inputfile > outputfile여기서, ^M를 통해 명령 행에서 제어 문자가 생성됩니다 Ctrl+V Ctrl+M.
LarsH

2
Mac OS의 다른 해결 방법 (10.13.6 High Sierra에서 테스트) : $sed 명령을 포함하는 작은 따옴표 앞에 a 를 넣으십시오 . sed $'s/\r$//'설명 : bash는 $'...'문자열 에서 백 슬래시 이스케이프를 디코딩합니다 . 자세한 내용은 gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html 을 참조하십시오.
jcsahnwaldt Reinstate Monica

127

이것은 Anne의 답변의 개선 된 버전입니다 .perl을 사용하면 새 파일을 생성하는 대신 'in-place'파일에서 편집 할 수 있습니다.

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
이 스크립트의 가장 좋은 점은 정규식을 사용하여 줄 끝 변환이 어떤 형식에서든 어떤 형식 으로든 변환해야한다는 것을 정확하게 보여줍니다.
pbr

Windows 시스템의 특정 Cygwin / git bash 설치에서는이 점에주의하십시오. 이것은 당신을 제공 할 수 있습니다 Can't do inplace edit on file: Permission denied.삭제 파일을. 대신 다른 유틸리티를 살펴보십시오.
Dennis

"Unix로 변환"을 보여 주셔서 감사합니다. 나는 그 길을 따르고 있었고 당신의 이중 응답이 나를 도왔고, 나의 투표를 받았습니다.
null

112

Homebrew로 unix2dos를 설치할 수 있습니다

brew install unix2dos

그런 다음이 작업을 수행 할 수 있습니다

unix2dos file-to-convert

dos 파일을 유닉스로 변환 할 수도 있습니다 :

dos2unix file-to-convert

9
지금이 문제를 겪고있는 사람이라면 이제 Homebrew 공식을이라고 dos2unix합니다. 하고 싶을 것이다 brew install dos2unix.
Geoff

13
실제로, brew install unix2dos또는 brew install dos2unix잘 작동합니다. 그들은 같은 패키지를 설치합니다. 당신에게 말하는 이름을 사용하십시오 :)
Steven Hirlston

2
또는 Macports의 경우 : port install dos2unix.
Fang

16

아마도 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.

cygwin을unix2dos 사용하는 DOS / Windows 시스템 또는 MacPorts를 사용하는 Mac에서 실행할 수 있습니다 .


unix2dos / dos2unix가 내 Mac에 존재하지 않으며 설치할 곳을 찾지 못했습니다. 아시나요?
Yarin

@mgadda : +1-예, MacPorts에서 홈 브루로 전환 한 적이 있습니다.
Paul R

15

그냥 tr삭제하십시오 :

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

1
펄과 sed를 시도했지만 작동하지 않았습니다 (알 수 있었지만 시도해 볼 가치가 없었습니다). 이것은 훌륭하게 작동했습니다.
RandomInsano 2016 년

이것은 Python을 사용하여 읽을 때 BBEdit의 행 번호와 일치하지 않는 첫 번째 솔루션이었습니다 wc -l.
Daryl Spitzer

1
이것은 실제로 줄 바꿈이 필요하지만 \ n을 사용하여 줄 바꿈을 모두 삭제하지만 \ n
UserYmY

" hints.macworld.com/article.php?story=20031018164326986 "에는 tr명령을 사용하여 다양한 변환을 수행 하는 방법에 대한 훌륭한 글이 있습니다 . hexdump파일에서 어떤 종류의 EOL (end-of-line) 규칙이 사용되는지 정확하게 알기 위해 사용 하거나 유사하게 사용하십시오.
Mike Robinson

6
  1. Homebrew와 함께 dos2unix 설치
  2. find ./ -type f -exec dos2unix {} \;현재 폴더 내의 모든 줄 끝을 재귀 적으로 변환하기 위해 실행

2

vimUNIX에서 DOS 형식으로 파일을 변환 할 수도 있습니다. 예를 들면 다음과 같습니다.

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

2

다음은 위의 답변과 함께 온 전성 검사 및 Mac OS X에서 작동하는 완전한 스크립트이며 다른 Linux / Unix 시스템에서도 작동합니다 (테스트되지는 않았지만).

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

여기 Davy Schmeits의 Weblog가 제공하는 정말 간단한 접근법이 있습니다 .

cat foo | col -b > foo2

여기서 foo는 줄 끝에 Control + M 문자가있는 파일이고, 생성하는 새 파일은 foo2입니다.


0

Yosemite OSX에서 다음 명령을 사용하십시오.

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

여기서 ^M시퀀스는 가압에 의해 달성된다 Ctrl+ VEnter.


또한 그주의 sed 않습니다 이해 백 슬래시 - 탈출 등 \r과``\ n` 따라서도 대체 이러한 사용할 수 있습니다. 실제로 문자 (또는 다른 문자)를 참조하기 위해 리터럴 제어 -M을 입력 할 필요는 없습니다. 사용의 원리 sed(그리고 -i할) 어떤 달리하기 때문에 이런 종류의 변환의 종류, 아주 좋은 것입니다 tr, 당신은 제한되지 않는다 "한 번에 하나 개의 문자."
Mike Robinson

0

짧은 perl 스크립트에서 perl을 사용하여 Anne과 JosephH의 답변을 확장합니다.
"unix2dos.pl"과 같은 이름의 파일을 작성하고 경로의 디렉토리에 넣으십시오. 두 줄을 포함하도록 파일을 편집하십시오.

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

"which perl"이 시스템에서 "/ usr / bin / perl"을 리턴한다고 가정하십시오. 파일을 실행 가능하게 만드십시오 (chmod u + x unix2dos.pl).

예 :
$ echo "hello"> xxx
$ od -c xxx (파일이 nl로 끝나는 지 확인)
0000000 hello \ n

$ unix2dos.pl xxx
$ od -c xxx (현재 cr lf로 끝나는 지 확인)
0000000 hello \ r \ n


0

왼쪽 패널의 Xcode 9에서 프로젝트 탐색기 에서 파일을 열거 나 선택하십시오 . 파일이 없으면 프로젝트 탐색기에 약물을 끌어다 놓습니다. .

우측 패널 찾기에 텍스트 설정 과 변화 라인 엔딩윈도우 (CRLF) .

XCode 스크린 덤프XCode에서 스크린 덤프

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.