[linux] Bash 스크립트에서 DOS / Windows 줄 바꿈 (CRLF)을 Unix 줄 바꿈 (LF)으로 변환하는 방법?

프로그래밍 방식으로 (예 :을 사용하지 않음 vi) DOS / Windows 줄 바꿈을 Unix로 변환하려면 어떻게해야합니까?

dos2unixunix2dos명령은 특정 시스템에서 사용할 수 없습니다. sed/ awk/ tr? 와 같은 명령을 사용하여이를 에뮬레이션하는 방법



답변

trDOS에서 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

그러나이 작업을 매우 자주 수행해야하는 경우 (대략 말하면) 변환 프로그램 (예 : dos2unixunix2dos, 또는 아마도 dtouutod) 을 설치하고 사용하는 것이 훨씬 합리적 입니다.

전체 디렉토리 및 서브 디렉토리를 처리해야하는 경우 다음을 사용할 수 있습니다 zip.

zip -r -ll zipfile.zip somedir/
unzip zipfile.zip

줄 끝이 CRLF에서 CR로 변경된 zip 아카이브가 생성됩니다. unzip그런 다음 변환 된 파일을 다시 제자리에 넣습니다 (파일별로 파일 요청-예 : 모두에게 대답 할 수 있음). 이것을 지적 해 준 @vmsnomad에게 감사의 말을 전한다.


답변

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.


답변

POSIX로 이것을하는 것은 까다 롭습니다 :

  • POSIX Sed\r또는을 지원하지 않습니다 \15. 그랬더라도 in place 옵션 -i은 POSIX가 아닙니다.

  • POSIX Awk\r및을 지원 \15하지만 -i inplace옵션은 POSIX가 아닙니다.

  • d2udos2unixPOSIX 유틸리티 가 아니지만 ex

  • POSIX 전은 지원하지 않습니다 \r, \15, \n또는\12

캐리지 리턴을 제거하려면 다음을 수행하십시오.

ex -bsc '%!awk "{sub(/\r/,\"\")}1"' -cx file

캐리지 리턴을 추가하려면 다음을 수행하십시오.

ex -bsc '%!awk "{sub(/$/,\"\r\")}1"' -cx file


답변

-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”는 파일을 디스크에 쓰고 편집기를 종료 함을 의미합니다 (루프에서 명령을 사용할 수 있음)


답변

AWK를 사용하면 다음을 수행 할 수 있습니다.

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

Perl을 사용하면 다음을 수행 할 수 있습니다.

perl -pe 's/\r$//' < dos.txt > unix.txt


답변

파일을 제자리에서 변환하려면

dos2unix <filename>

변환 된 텍스트를 다른 파일로 출력하려면

dos2unix -n <input-file> <output-file>

우분투 또는 데비안에서 설치할 수 있습니다

sudo apt install dos2unix

또는 homebrew를 사용하는 macOS

brew install dos2unix


답변

이 문제는 표준 도구를 사용하여 해결할 수 있지만 flip20 년 전에 필자 인 Rahul Dhesi가 작성한 명령 을 설치하는 것이 좋습니다 zoo. 예를 들어 바이너리 파일이 실수로 파괴되는 것을 피하면서 파일 형식을 변환하는 훌륭한 작업을 수행합니다.