답변:
tr
DOS에서 Unix로 변환 하는 데 사용할 수 있습니다 . 그러나 CR이 파일에 CRLF 바이트 쌍의 첫 번째 바이트로만 나타나는 경우에만이 작업을 안전하게 수행 할 수 있습니다. 이것은 일반적으로 그렇습니다. 그런 다음 다음을 사용하십시오.
tr -d '\015' <DOS-file >UNIX-file
이름 DOS-file
은 이름 과 다릅니다 UNIX-file
. 같은 이름을 두 번 사용하려고하면 파일에 데이터가 없게됩니다.
다른 방법으로 (표준 'tr'로) 수행 할 수 없습니다.
캐리지 입력 방법을 알고 있으면 스크립트로 리턴하십시오 ( control-V, control-Mcontrol-M 입력).
sed 's/^M$//' # DOS to Unix
sed 's/$/^M/' # Unix to DOS
여기서 '^ M'은 control-M 문자입니다. bash
ANSI-C Quoting 메커니즘을 사용하여 캐리지 리턴을 지정할 수도 있습니다 .
sed $'s/\r$//' # DOS to Unix
sed $'s/$/\r/' # Unix to DOS
그러나이 작업을 매우 자주 수행해야하는 경우 (대략 말하면) 변환 프로그램 (예 : dos2unix
및 unix2dos
, 또는 아마도 dtou
및 utod
) 을 설치하고 사용하는 것이 훨씬 합리적 입니다.
전체 디렉토리 및 서브 디렉토리를 처리해야하는 경우 다음을 사용할 수 있습니다 zip
.
zip -r -ll zipfile.zip somedir/
unzip zipfile.zip
줄 끝이 CRLF에서 CR로 변경된 zip 아카이브가 생성됩니다. unzip
그런 다음 변환 된 파일을 다시 제자리에 넣습니다 (파일별로 파일 요청-예 : 모두에게 대답 할 수 있음). 이것을 지적 해 준 @vmsnomad에게 감사의 말을 전한다.
tr -d '\015' <DOS-file >UNIX-file
where DOS-file
==를 사용 UNIX-file
하면 빈 파일이 생성됩니다. 불행하게도 출력 파일은 다른 파일이어야합니다.
sed
옵션 -i
(현재 위치 용)이 작동합니다. 제한은 링크 된 파일과 심볼릭 링크입니다. 이 sort
명령은 'always'(이전이 아닌 경우 1979 년 이후) -o
에서 입력 파일 중 하나를 나열 할 수 있는 옵션을 지원했습니다 . 그러나 일부 sort
는 출력을 쓰기 전에 모든 입력을 읽어야하기 때문입니다. 다른 프로그램은 입력 파일 중 하나를 덮어 쓰는 것을 산발적으로 지원합니다. Kernighan & Pike의 'UNIX Programming Environment' 에서 문제를 피하기위한 범용 프로그램 (스크립트)을 찾을 수 있습니다 .
sed -i $'s/\r$//' filename
-제자리에서 편집하십시오. 인터넷에 액세스 할 수없는 컴퓨터에서 작업 중이므로 소프트웨어 설치에 문제가 있습니다.
tr -d "\r" < file
살펴 여기에 사용 예제 sed
:
# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
sed 's/.$//' # assumes that all lines end with CR/LF
sed 's/^M$//' # in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//' # works on ssed, gsed 3.02.80 or higher
# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format.
sed "s/$/`echo -e \\\r`/" # command line under ksh
sed 's/$'"/`echo \\\r`/" # command line under bash
sed "s/$/`echo \\\r`/" # command line under zsh
sed 's/$/\r/' # gsed 3.02.80 or higher
사용 sed -i
에 적절한 변환 예에 sed -i 's/..../' file
.
\r
:tr "\r" "\n" < infile > outfile
-d
더 자주 표시되며 "전용 \r
"상황 에서는 도움이되지 않습니다 .
\r
로 \n
매핑 두 번 간격 파일의 효과가있다; DOS로 끝나는 각 단일 CRLF 행 \n\n
은 Unix로됩니다.
POSIX로 이것을하는 것은 까다 롭습니다 :
POSIX Sed 는 \r
또는을 지원하지 않습니다 \15
. 그랬더라도 in place 옵션 -i
은 POSIX가 아닙니다.
POSIX Awk 는 \r
및을 지원 \15
하지만 -i inplace
옵션은 POSIX가 아닙니다.
d2u 및 dos2unix 는 POSIX 유틸리티 가 아니지만 ex 는
POSIX 전은 지원하지 않습니다 \r
, \15
, \n
또는\12
캐리지 리턴을 제거하려면 다음을 수행하십시오.
ex -bsc '%!awk "{sub(/\r/,\"\")}1"' -cx file
캐리지 리턴을 추가하려면 다음을 수행하십시오.
ex -bsc '%!awk "{sub(/$/,\"\r\")}1"' -cx file
tr
지원하는\r
것처럼 보입니다 . 그래서 당신은 또한 사용할 수 있습니다 printf '%s\n' '%!tr -d "\r"' x | ex file
(물론, \r
바로 앞 이 아니더라도 제거되었습니다 \n
). 또한 POSIX 에서 -b
옵션을 ex
지정하지 않았습니다.
-c {command} 옵션으로 프로그래밍 방식으로 vim을 사용할 수 있습니다.
유닉스에 할 일 :
vim file.txt -c "set ff=unix" -c ":wq"
유닉스 할일 :
vim file.txt -c "set ff=dos" -c ":wq"
"set ff = unix / dos"는 파일의 파일 형식 (ff)을 Unix / DOS 줄 끝 형식으로 변경하는 것을 의미합니다
": wq"는 파일을 디스크에 쓰고 편집기를 종료 함을 의미합니다 (루프에서 명령을 사용할 수 있음)
vi
은 무엇을 :wq
의미 하는지 알게 될 것 입니다. 3자가 아닌 사람들은 1) vi 명령 영역 열기, 2) 쓰기 및 3) 종료를 의미합니다.
이 문제는 표준 도구를 사용하여 해결할 수 있지만 flip
20 년 전에 필자 인 Rahul Dhesi가 작성한 명령 을 설치하는 것이 좋습니다 zoo
. 예를 들어 바이너리 파일이 실수로 파괴되는 것을 피하면서 파일 형식을 변환하는 훌륭한 작업을 수행합니다.
지금까지 게시 된 솔루션은 문제의 일부만 처리하여 DOS / Windows의 CRLF를 Unix의 LF로 변환합니다. 그들이 누락 된 부분은 DOS가 CRLF를 줄 구분자로 사용하는 반면 Unix는 LF를 줄 종결 자로 사용한다는 것 입니다. 차이점은 DOS 파일 (일반적으로)은 파일의 마지막 줄 뒤에 아무것도 없지만 Unix는 그렇지 않습니다. 변환을 올바르게 수행하려면 최종 LF를 추가해야합니다 (파일의 길이가 0이 아닌 경우 (예 : 전혀 줄이없는 경우)). 내가 가장 좋아하는 incantation (맥 스타일의 CR 분리 파일을 처리하는 논리가 추가되어 있으며 이미 유닉스 형식 인 가장 성가신 파일은 아닙니다)은 약간 펄입니다.
perl -pe 'if ( s/\r\n?/\n/g ) { $f=1 }; if ( $f || ! $m ) { s/([^\n])\z/$1\n/ }; $m=1' PCfile.txt
파일의 Unixified 버전을 stdout으로 보냅니다. 파일을 Unixified 버전으로 바꾸려면 perl의 -i
플래그를 추가하십시오 .
dos2unix에 액세스 할 수 없지만이 페이지를 읽을 수있는 경우 여기에서 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))
수퍼 유저 로부터 교차 게시되었습니다 .
dos2unix
변환 합니다 . 사용법은 -n
매개 변수를 의미합니다 . 그리고 실제 dos2unix
는 파일을 제공하지 않으면 stdin에서 읽고 stdout에 쓰는 필터입니다.
PCRE로 쉽게 슈퍼 듀퍼;
스크립트로 사용하거나 $@
파일로 교체 하십시오.
#!/usr/bin/env bash
perl -pi -e 's/\r\n/\n/g' -- $@
파일을 덮어 씁니다!
백업 (버전 제어 또는 기타)으로 만 수행하는 것이 좋습니다.
--
. 이해하고 적응하기 쉽기 때문에이 솔루션을 선택했습니다. 참고로, 이것은 스위치가하는 일입니다 : -p
"while input"루프를 가정하고, -i
입력 파일을 제자리에 편집하고, -e
다음 명령을 실행하십시오
프로그램이없는 더 간단한 awk 솔루션 :
awk -v ORS='\r\n' '1' unix.txt > dos.txt
기술적으로 '1'은 귀하의 프로그램이며 b / c awk는 옵션이 주어질 때 하나를 요구합니다.
업데이트 : 오랫동안이 페이지를 처음 방문한 후에 아무도 내부 솔루션을 아직 게시하지 않았다는 것을 깨달았습니다.
while IFS= read -r line;
do printf '%s\n' "${line%$'\r'}";
done < dos.txt > unix.txt
awk -v RS='\r\n' '1' dos.txt > unix.txt
awk
이나 sed
솔루션 보다 훨씬 느립니다 . 또한 while IFS= read -r line
입력 줄을 충실하게 보존 하기 위해 사용해야합니다 . 그렇지 않으면 선행 및 후행 공백이 read
잘 $REPLY
립니다 ( 또는 명령에 변수 이름을 사용하지 않고 작업 ).
똑같은 질문 (Windows 측에서도 Linux에도 동일하게 적용 가능)을 숙고해야했습니다. 아마도 아무도 좋은 이전 zip -ll
옵션 (Info-ZIP)을 사용하여 텍스트 파일에 대해 CRLF <-> LF 변환을 수행하는 자동화 된 방법을 언급하지 않았습니다 .
zip -ll textfiles-lf.zip files-with-crlf-eol.*
unzip textfiles-lf.zip
참고 : 이렇게하면 원래 파일 이름은 유지하지만 줄 끝은 LF로 변환되는 zip 파일이 만들어집니다. 그런 다음 unzip
압축을 푼 파일, 즉 원래 이름 (LF 끝)을 사용하여 로컬 원본 파일을 덮어 쓸지 묻는 메시지가 표시됩니다.
의 관련 발췌 zip --help
:
zip --help
...
-l convert LF to CR LF (-ll CR LF to LF)
Homebrew가 설치된 경우 Mac OSX의 경우 [ http://brew.sh/][1]
brew install dos2unix
for csv in *.csv; do dos2unix -c mac ${csv}; done;
이 명령으로 파일을 수정하므로 파일 사본을 작성했는지 확인하십시오. -c mac 옵션은 스위치가 osx와 호환되도록합니다.
-c mac
OS 이전 X CR
전용 줄 바꿈 을 변환하는 데 사용하지 않아야합니다 . 이 모드는 Mac OS 9 이전 또는 이전의 파일에 대해서만 사용하려고합니다.
sed --expression='s/\r\n/\n/g'
질문에 sed가 언급되었으므로 sed를 사용하여이를 달성하는 가장 직접적인 방법입니다. 표현에 따르면 캐리지 리턴과 줄 바꿈을 모두 줄 바꿈만으로 바꿉니다. 이것이 Windows에서 Unix로 갈 때 필요한 것입니다. 작동하는지 확인했습니다.
OSX에서 sed 's / ^ M $ //'file.txt와 여러 가지 다른 방법을 시도했습니다 ( http://www.thingy-ma-jig.co.uk/blog/25-11-2010/fixing- dos-line-endings 또는 http://hintsforums.macworld.com/archive/index.php/t-125.html ). 아무것도 작동하지 않고 파일은 변경되지 않은 상태로 남아 있습니다 (^ M을 재현하려면 Ctrl-v Enter가 필요함). 결국 나는 TextWrangler를 사용했습니다. 그것은 엄격하게 명령 줄이 아니지만 작동하며 불평하지 않습니다.
dos2unix
패키지 관리자를 사용하여 설치 하면 훨씬 간단하고 대부분의 플랫폼에 존재합니다.