Unix 환경에서 특정 SQL 스크립트를 실행할 때 SQL 스크립트의 각 줄 끝에 '^ M'문자가 표시되어 명령 줄에 표시됩니다. SQL 스크립트가 원래 어떤 OS에서 생성되었는지 모르겠습니다.
이 문제의 원인은 무엇이며 어떻게 해결합니까?
Unix 환경에서 특정 SQL 스크립트를 실행할 때 SQL 스크립트의 각 줄 끝에 '^ M'문자가 표시되어 명령 줄에 표시됩니다. SQL 스크립트가 원래 어떤 OS에서 생성되었는지 모르겠습니다.
이 문제의 원인은 무엇이며 어떻게 해결합니까?
답변:
원인은 Windows 기반 OS와 Unix 기반 OS가 줄 끝 마커를 저장하는 방법의 차이입니다.
Windows 기반 운영 체제는 DOS 유산 덕분에 줄 끝을 문자 쌍 0x0D0A
(캐리지 리턴 + 줄 바꿈)으로 저장합니다. Unix 기반 운영 체제는 0x0A
( 라인 피드 )를 사용합니다. ^M
당신이보고있는이의 시각적 표현이다0x0D
(A 캐리지 리턴 ).
dos2unix 가 도움이 될 것입니다. 또한 스크립트 소스를 'Unix 친화적'으로 조정해야 할 수도 있습니다.
^M
? 왜 '^'? 왜 'M'인가?
가장 쉬운 방법은 vi
. 끔찍하게 들리지만 간단하고 대부분의 UNIX 환경에 이미 설치되어 있음을 알고 있습니다. ^ M은 Windows / DOS 환경의 새로운 행입니다.
명령 프롬프트에서 : $ vi filename
그런 다음 " :
"을 눌러 명령 모드로 들어갑니다.
전체적으로 모두 검색 및 바꾸기는 :%s/^M//g
" Ctrl 키를 누른 상태에서 V를 누른 다음 M " 을 누르면 ^ M이 아무것도 바뀌지 않습니다.
그런 다음 작성하고 종료하려면 " :wq
"를 입력하십시오. 완료!
dos2unix를 사용하여 ^ M을 제거하십시오.
SQL 스크립트는 원래 Windows OS에서 생성되었습니다. '^ M'문자는 줄 끝 문자에 사용할 내용에 대해 Windows와 Unix가 서로 다른 아이디어를 가진 결과입니다. 이 문제를 해결하기 위해 명령 줄에서 perl을 사용할 수 있습니다.
perl -pie 's/\r//g' filename.txt
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)
tr을 사용하여 DOS / Windows (\ r \ n) 줄 끝을 Unix (\ n) 줄 끝으로 변환합니다.
tr '\r\n' '\n' < dosFile.txt > unixFile.txt