Windows에서 Unix ^M으로 FTP 뒤에 추가된 스크립트에서 특수 모드를 제거합니다.

Windows에서 Unix ^M으로 FTP 뒤에 추가된 스크립트에서 특수 모드를 제거합니다.

FTP를 사용하여 Windows 파일을 Unix 시스템으로 보내고 ^M개행 문자가 필요한 파일을 추가했는데 그냥 삭제하고 싶었습니다.

내가 가진 옵션 중 하나는 dos2unix명령을 실행하는 것입니다.

그러한 패턴을 제거하는 다른 방법(예: sed명령)을 제안할 수 있는 사람이 있습니까?

답변1

Windows 줄 끝은 두 개의 문자 시퀀스 CR, LF로 구성됩니다. CR은 캐리지 리턴 문자이며 때로는 , 등으로 \r표현 됩니다 \015. ^M유닉스 줄 끝은 LF 문자입니다.

모든 Unix 변형에 존재하는 표준 유틸리티만 사용하여 Windows 줄 끝을 Unix 줄 끝으로 변환하는 방법은 다음을 사용하는 것입니다.tr유용.

tr -d '\r' <thefile >thefile.new && mv thefile.new thefile

파일에 이미 Unix 줄 끝이 있으면 해당 내용은 변경되지 않습니다.

현재 디렉터리에 변환할 파일이 많으면 루프를 사용할 수 있습니다. 이름이 다음으로 끝나는 파일이 없다고 가정합니다 .new.

for x in *; do
  tr -d '\r' <"$x" >"$x.new" && mv "$x.new" "$x"
done

Linux(일부 임베디드 Linux 시스템 제외) 또는 Cygwin에서 다음을 사용할 수 있습니다.sed. 파일을 내부에서 편집하는 옵션은 -i이러한 시스템에만 적용됩니다. CR 문자 표현 \r은 더 일반적이지만 보편적이지는 않습니다.

sed -i -e 's/\r//g' thefile

답변2

DOS2유닉스:

sed -i -r -e 's/\r$//' file

UNIX2DOS:

sed -i -r -e 's/$/\r/' file

답변3

sed -i -r -e 's/\r$//' file"dos2unix"의 경우보다 낫습니다.sed -i -e 's/\r//g' file

후자의 경우, 고전적인 Mac 스타일 파일(개행 문자가 '\r'인 경우)에서 실행하면 새 파일은 Unix 스타일이 아닐 뿐만 아니라 개행 문자도 전혀 없습니다. 모든 것이 정렬됩니다.

편집: 다시 한 번 주석에서 언급했듯이 sed 's/^M//g' file^ 기호는 줄 시작 부분의 sed 코드이므로 줄 시작 부분의 모든 M을 제거하므로 sed를 사용하는 것이 좋습니다. 앞에 M만 있는 여러 줄이 있는 텍스트 파일을 만들었고 해당 sed 명령을 사용하면 개행 외에는 아무것도 출력되지 않았습니다.

답변4

사용sed:

sed 's/^M//g' filename > newfilename

관련 정보