본문 바로가기
IT/LINUX

리눅스 ^M 또는 특수문자(CRLF) 제거 치환하기

by SidePower 2021. 3. 3.

 

일을 하다 보면 윈도우 환경에서 프로그램 코딩을 하고

ftp를 통해 리눅스 서버로 소스파일을 전송해서

다시 리눅스에서 컴파일해서 실행을 하곤 하는데요.

 

이럴 때 눈에 보이지 않지만 라인 끝 부분에

윈도우 개행문자가 그대로 표시되어

리눅스에서 컴파일 안되는 경우가 종종 생기더라고요.

 

윈도우 개행문자가 리눅스에서는 ^M 이렇게 표시됩니다.^^;;

 

 

이렇게 특수문자가 생기는 이유는

윈도우와 리눅스(유닉스) OS의 개행문자가 서로 다르기 때문입니다.

 

 

윈도우의 개행문자는 CR+LF 

    → CR+LF 두 개의 문자로 줄바꿈 처리

 

리눅스(유닉스) 개행문자는 LF

    → LF 하나의 문자로 줄바꿈 처리

 

 

CR : Carriage Return → 캐리지 리턴

      커서의 위치를 라인 맨 앞으로 이동

LF : Line Feed 라인 피드

      현재 위치에서 다음 라인으로 이동

 

 

개행문자의 차이로 인해 

리눅스에서 작성한 문서를 ftp를 통해 윈도우로 전송한 뒤 열어보면

한 줄처럼 보이는 현상을 보실 수 있을 거예요.

왜냐하면

윈도우는 라인 끝에 CR+LF 개행문자가 있어서 줄바꿈을 하는데

LF만 있어서 줄바꿈을 인식할 수 없기 때문입니다.

 

반대로 

윈도우의 문서를 리눅스에서 보면 라인 끝에 CR + LF 개행문자가 있기 때문에

CR은 단순히 특수문자로만 인식하고 LF만으로 줄바꿈을 해요.

그래서 CR에 대한 특수문자 ^M이 남아 있게 됩니다.

 

 

리눅스에서는 전혀 필요 없는 ^M 특수문자를 제거해 보겠습니다.

 

^M는 키보드 숫자 6에 있는 ^와 M이 아닙니다. ^^;;

Ctrl + v + m 키보드를 통한 특수문자로 표기된 문자입니다.

^M Ctrl + v + m

 

여러 가지 방법이 있는데요. 주로 사용하기 편한 방법을 알아볼게요.

 

원본

cat -v 파일

hello world^M
nice meet you^M
Good job^M

 

vi 편집기


vi 또는 vim 편집기를 바이너리 모드로 열기

vi -b 파일

hello world^M
nice meet you^M
Good job^M


① 문자열 치환 명령어

▶ %s → 모든 라인 치환
▶ %s/원본문자/바꿀문자/g → 바꿀문자는 보통 공백 //으로 하는데 원하시는 문자를 하셔야 되요. 
Esc + :  Command mode 전환

:%s/^M//g

② 문자열 치환 명령어 라인 범위 지정

▶ 1,$s → 1 라인부터 $ 마지막 라인까지 범위     
     1,3s → 1라인부터 3 라인까지 범위
▶ 1,$s/원본문자/바꿀문자/g
Esc + :  Command mode 전환
:1,$s/^M//g

 

tr 명령어

tr 은 문자를 치환하거나 삭제하는 명령어입니다.


① -d 옵션으로 문자 삭제 후 화면에 표시

tr -d "
^M" < 파일


② 문자 후에 새파일에 저장하기

tr -d "^M" < 파일 > New파일

 

 sed 명령어

sed 명령어는 문자를 치환 , 삭제 , 삽입이 가능한 막강한 명령어입니다.
vi 편집기의 :%s 또는 :s 가 sed를 줄여서 s만 표기한거에요.


① 공백으로 치환해서 화면에 표시

sed "s/^M//g" 파일


② 공백으로 치환해서 New파일에 저장

sed "s/^M//g" 파일 > New파일


③ 공백으로 치환해서 원본파일에 그대로 저장

sed -i "s/^M//g" 파일

 

감사합니다.

반응형

댓글