Programming

줄 끝의 '^ M'문자

procodes 2020. 8. 22. 12:26
반응형

줄 끝의 '^ M'문자


Unix 환경에서 특정 SQL 스크립트를 실행할 때 SQL 스크립트의 각 줄 끝에 '^ M'문자가 표시되어 명령 줄에 표시됩니다. SQL 스크립트가 원래 어떤 OS에서 생성되었는지 모르겠습니다.

이 문제의 원인은 무엇이며 어떻게 해결합니까?


DOS / Windows 줄 끝 문자로 인해 발생합니다. Andy Whitfield가 말했듯이 Unix 명령 dos2unix는 문제를 해결하는 데 도움이 될 것입니다. 더 자세한 정보를 원하시면 해당 명령에 대한 매뉴얼 페이지를 읽어보십시오.


vi다음을 실행하여 줄 끝을 수정합니다 .

:set fileformat=unix

:w


원인은 Windows 기반 OS와 Unix 기반 OS가 줄 끝 마커를 저장하는 방법의 차이입니다.

Windows 기반 운영 체제는 DOS 유산 덕분에 줄 끝을 문자 쌍 0x0D0A(캐리지 리턴 + 줄 바꿈)으로 저장합니다. Unix 기반 운영 체제는 0x0A( 라인 피드 )를 사용합니다. ^M당신이보고있는이의 시각적 표현이다 0x0D(A 캐리지 리턴 ).

dos2unix 가 도움이 될 것입니다. 또한 스크립트 소스를 'Unix 친화적'으로 조정해야 할 수도 있습니다.


가장 쉬운 방법은 vi. 끔찍하게 들리지만 간단하고 대부분의 UNIX 환경에 이미 설치되어 있음을 알고 있습니다. ^ M은 Windows / DOS 환경의 새로운 행입니다.

명령 프롬프트에서 : $ vi filename

그런 다음 " :"을 눌러 명령 모드로 들어갑니다.

전체적으로 모두 검색 및 바꾸기는 :%s/^M//g" Ctrl 키를 누른 상태에서 V를 누른 다음 M " 을 누르면 ^ M이 아무것도 바뀌지 않습니다.

그런 다음 작성하고 종료하려면 " :wq"를 입력하십시오. 완료!


dos2unix를 사용하여 ^ M을 제거하십시오.


vi에서 :%s/^M//g

키를 ^M잡으 려면 다음 (Ctrl 키를 누른 상태에서 둘 다)를 누르면가 나타납니다. 이렇게하면 모든 발생을 찾아서 아무것도없는 것으로 바꿉니다.CTRLVM^M


SQL 스크립트는 원래 Windows OS에서 생성되었습니다. '^ M'문자는 줄 끝 문자에 사용할 내용에 대해 Windows와 Unix가 서로 다른 아이디어를 가진 결과입니다. 이 문제를 해결하기 위해 명령 줄에서 perl을 사용할 수 있습니다.

perl -pie 's/\r//g' filename.txt

^ M은 일반적으로 Windows 연산자 줄 바꿈으로 인해 발생하며 Unix로 변환되어 ^ M처럼 보입니다. dos2unix 명령은 그것들을 멋지게 제거해야합니다

dos2unix [옵션] [-c convmode] [-o 파일 ...] [-n infile outfile ...]


C:\tmp\text>dos2unix hello.txt helloUNIX.txt

Sed는 훨씬 더 널리 사용 가능하며 dos2unix가 설치되지 않은 경우에도 이러한 종류의 작업을 수행 할 수 있습니다.

C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt  

tr을 시도해 볼 수도 있습니다.

cat hello.txt | tr -d \r > helloUNIX2.txt  

결과는 다음과 같습니다.

C:\tmp\text>dumphex hello.txt  
00000000h: 48 61 68 61 0D 0A 68 61 68 61 0D 0A 68 61 68 61 Haha..haha..haha  
00000010h: 0D 0A 0D 0A 68 61 68 61 0D 0A                   ....haha..  

C:\tmp\text>dumphex helloUNIX.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

C:\tmp\text>dumphex helloUNIX2.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

vi 편집기에서 ^ M 문자를 바꾸려면 아래를 사용하십시오.

t1.txt라고 말한 텍스트 파일을 엽니 다.

vi t1.txt

를 눌러 명령 모드로 들어갑니다. shift + :

그런 다음 언급 한대로 키를 누릅니다. %s/^M/\r/g

in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)

dos2unix명령에 대한 대안 sed.

예를 들어, unix에 대한 dos :

sed 's/\r$//' dos.txt > unix.txt

유닉스 할 일 :

sed 's/$/\r/' unix.txt > dos.txt

sed 명령을 통해 파일에서 ^ M을 직접 제거 할 수 있습니다. 예 :

sed -i'.bak' s/\r//g *.*

변경 사항이 마음에 들면 .bak 파일을 제거합니다.

rm -v *.bak

tr을 사용하여 DOS / Windows (\ r \ n) 줄 끝을 Unix (\ n) 줄 끝으로 변환합니다.

tr '\r\n' '\n' < dosFile.txt > unixFile.txt

Post about replacing newlines from the Unix command line


od -a $file is useful to explore those types of question on Linux (similar to dumphex in the above).


In Perl, if you don't want to set the $/ variable and use chomp() you can also do:

$var =~ /\r\n//g;

My two cents


Another vi command that'll do: :%s/.$// This removes the last character of each line in the file. The drawback to this search and replace command is that it doesn't care what the last character is, so be careful not to call it twice.

참고URL : https://stackoverflow.com/questions/64749/m-character-at-end-of-lines

반응형