2009. 9. 14.

^M문자없애기

^M문자없애기

vi로 문서를 보다 보면 줄끝마다 ^M 이 보이는 경우가 있습니다.
이는 윈도우시리즈(도스포함)에서 작성된 문서를 유닉스로 볼때 생기는 현상 입니다.

이런 현상이 왜 생기는 이유는 윈도우와 유닉스에서의 ASCII화일 형식이 서로 다릅니다.

일단 윈도우에서는 엔터시에 한줄을 내리고 커서를 앞으로 보내주지만 즉,엔터 한번으로
두 명령이 입력되는거죠..

하지만 유닉스에서는 엔터치면 단지 줄만 바뀌죠..즉 한번의 엔터는 단지 한번의 명령일 뿐 입니다..^^;

그래서 도스파티션에 있는 화일을 그냥 카피하면 ^M자들이 지저분하게 보이죠..

반대로 유닉스용 화일을 도스로 카피해서 도스용 에디터로 보면 전부 한줄로 붙어서 나타나게 된답니다.

아래는 몇가지 방법입니다.

1. vi 에디터를 이용해서 ^M 문자 없애는 방법

1) tr 을 이용합니다.
vi 에디터에서 다음과 같이 입력합니다. 여기서 1G는 첫라인으로 간다는
뜻이고, 느낌표부터는 쉘명령 tr을 이용한다는 겁니다.

1G!Gtr -d ^M

2) ed 명령을 사용합니다.
vi 에디터에서 다음과 같이 입력합니다. 여기서 : 는 아시다시피
명령모드로 가는 거구, 1은 첫라인을 $는 마지막 라인을 의미합니다.
그러므로 여기서 1,$ 는 첫라인부터 마지막라인까지라는 뜻이겠죠?
s는 substitute의 약자로써 다음의 /피대체어/대체어/ 에서
피대체어를 대체어로 바꾼다는 것입니다. 여기서는 ^M을 없애라는
뜻이겠죠? 마지막의 g는 global의 약자로 각 라인에서 해당문자열이
나올때마다 몽땅 바꾸라는 의미.

:1,$s/^M//g


2. perl 을 이용하는 방법

perl -pi -e 's/\r//' inputfile


3. sed 를 이용하는 방법

1 번 vi 에디터를 이용하는 방법에서 언급 되었습니다. 커맨드라인상에서
바로 수정하는 방법.

sed 's/^M//g' inputfile > outputfile


4. awk 를 이용하는 방법

print $0 는 문서전체를 의미합니다.

awk '{print $0,"\r"}' inputfile > outputfile


5. tr 을 이용하는 방법

1 번 vi 에디터를 이용하는 방법에서도 언급되었지만 에디터를 부르지
않고 커맨드라인상에서 바로 고치는 방법입니다. -d 옵션은 delete를 의미.

tr -d '\015' < inputfile > outputfile


6. mcopy 이용시 옵션을 주는 방법

-t 옵션을 이용하면 mcopy로 복사할때 ^M 문자가 없어지고 copy됩니다.

mcopy -t a:/test.cap .

7. fromdos 명령을 이용하는 방법

간단히 리눅스에 포함되어있는 유틸리티를 이용하는 방법입니다. fromdos는
도스용 문서를 리눅스(유닉스)용으로, todos는 리눅스에서 도스용으로 변환
할때 사용할 수 있습니다.

fromdos inputfile


참고 : ^M 의 입력은 [Ctrl+V][Ctrl+M] 입니다.


또다른 방법하나.

//g$s/
요렇게 하면 몽땅 지워집니다.
1 은 첫라인부터
$ 은 마지막라인까지
s 는 다음과 같이 바꾸는데...
^M 은 입력할때 Ctrl+V M 요렇게 해야허구...
// 는 원래 요사이에 뭔 string이 들어가야하지만
없애야하기에 암껏두 안썼음.
g 는 문서전체에 걸쳐 몽땅...

이게 귀찮으시면 그냥 fromdos 명령 사용하세요~


저는 보통 vi 편집기 명령모드에서 :1,$s/^M//g 이걸로 ^M을 없애고 있습니다..

댓글 없음: