[linux] Bash 스크립트에서 DOS / Windows 줄 바꿈 (CRLF)을 Unix 줄 바꿈 (LF)으로 변환하는 방법?
프로그래밍 방식으로 (예 :을 사용하지 않음 vi
) DOS / Windows 줄 바꿈을 Unix로 변환하려면 어떻게해야합니까?
dos2unix
및 unix2dos
명령은 특정 시스템에서 사용할 수 없습니다. sed
/ awk
/ tr
? 와 같은 명령을 사용하여이를 에뮬레이션하는 방법
답변
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 "\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가 아닙니다. -
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
답변
-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
답변
이 문제는 표준 도구를 사용하여 해결할 수 있지만 flip
20 년 전에 필자 인 Rahul Dhesi가 작성한 명령 을 설치하는 것이 좋습니다 zoo
. 예를 들어 바이너리 파일이 실수로 파괴되는 것을 피하면서 파일 형식을 변환하는 훌륭한 작업을 수행합니다.