유닉스 환경에서 특정 SQL 스크립트를 실행하면 SQL 스크립트의 각 줄 끝에 명령 줄에 에코되는 '^ M'문자가 표시됩니다. SQL 스크립트가 처음 작성된 OS를 모르겠습니다.
이 원인은 무엇이며 어떻게 해결합니까?
DOS/Windows 줄 끝 문자로 인해 발생합니다. Andy Whitfield가 말했듯이 유닉스 명령 dos2unix는 문제를 해결하는 데 도움이됩니다. 자세한 정보가 필요하면 해당 명령에 대한 매뉴얼 페이지를 읽으십시오.
다음을 실행하여 vi
에서 줄 끝을 수정하십시오.
:set fileformat=unix
:w
가장 쉬운 방법은 vi
를 사용하는 것입니다. 끔찍하게 들리지만 간단하고 이미 대부분의 UNIX 환경에 설치되어 있습니다. ^ M은 Windows/DOS 환경의 새로운 라인입니다.
명령 프롬프트에서 : $ vi filename
그런 다음 ":
"명령 모드로 이동합니다.
전체 검색 및 바꾸기는 :%s/^M//g
"제어를 길게 누른 다음 V를 누른 다음 M을 누름"^ M을 아무것도 대체하지 않습니다.
그런 다음 ":wq
"완료!
^ s를 제거하기 위해 dos2unix를 사용하십시오.
Vi에서 :%s/^M//g
^M
잡고 CTRL 키 누름 V 그때 M (Control 키를 누른 상태)와 ^M
나타날거야. 이것은 모든 발생을 찾아서 아무것도 아닌 것으로 대체합니다.
SQL 스크립트는 원래 Windows OS에서 작성되었습니다. '^ M'문자는 Windows와 Unix가 EOL (End-of-Line) 문자에 사용할 항목에 대해 다른 아이디어를 갖는 결과입니다. 명령 행에서 Perl을 사용하여이 문제를 해결할 수 있습니다.
Perl -pie 's/\r//g' filename.txt
^ M은 일반적으로 Windows 연산자 줄 바꿈으로 인해 발생하며 Unix로 번역 된 것은 ^ M과 같습니다. dos2unix 명령은 잘 제거해야합니다
dos2unix [옵션] [-c convmode] [-o 파일 ...] [-n 파일 출력 파일 ...]
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
와 같은 표준 유틸리티를 사용하는 것입니다.
예를 들어, 유닉스를 수행합니다.
sed 's/\r$//' dos.txt > unix.txt
유닉스 할일 :
sed 's/$/\r/' unix.txt > dos.txt
Tr을 사용하여 DOS/Windows (\ r\n) 줄 끝을 Unix (\ n) 줄 끝으로 변환합니다 :
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
Sed 명령을 통해 파일에서 ^ M을 직접 제거 할 수 있습니다 (예 :
sed -i'.bak' s/\r//g *.*
변경 내용에 만족하면 .bak 파일을 제거하십시오.
rm -v *.bak
Perl에서 $/변수를 설정하고 chomp ()를 사용하지 않으려면 다음을 수행하십시오.
$var =~ /\r\n//g;
내 두 센트
od -a $file
는 Linux에서 이러한 유형의 질문을 탐색하는 데 유용합니다 (위의 dumphex와 유사).