줄 끝의 '^ 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
'Programming' 카테고리의 다른 글
| MongoDB 셸 출력을 파일로 '예쁘게'인쇄하는 방법이 있습니까? (0) | 2020.08.22 |
|---|---|
| pandas read_csv의 datetime dtypes (0) | 2020.08.22 |
| openssl을 사용하여 pfx를 pem으로 변환 (0) | 2020.08.22 |
| 부분이 존재하는지 확인하는 Rails 함수가 있습니까? (0) | 2020.08.22 |
| Heroku에서 Git 리모컨을 변경하는 방법 (0) | 2020.08.22 |