일을 하다 보면 윈도우 환경에서 프로그램 코딩을 하고
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" 파일 |
감사합니다.
'IT > LINUX' 카테고리의 다른 글
리눅스 yum epel 이란 . epel 저장소 추가하기 (0) | 2021.10.27 |
---|---|
리눅스 vi(vim) 복사 붙여넣기 주석 자동으로 생기는 현상과 계단 현상 (0) | 2021.03.15 |
리눅스 자바 설치하기 . 컴파일(javac) 실행(java) (4) | 2021.02.19 |
리눅스 gzip 명령어 사용법 . 다름이름으로 압축풀기 (4) | 2021.02.02 |
리눅스 find 명령어 사용법 (4) | 2021.01.31 |
댓글