줄 끝의 '^ M'문자


99

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

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

답변:


79

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


3
일부 시스템 (예 : 우분투)이 명령의 이름은 "fromdos"입니다에
bobwienholt

6
brew install dos2unixhomebrew를 설치하면 OSX에서 도구를 매우 쉽게 얻을 수 있습니다.
philipp

73

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

:set fileformat=unix

:w


2
이것은 훌륭한 대답입니다. 감사합니다. (아마도 한 번만 사용하는 도구 인 dos2unix 설치 저장)
Jamsi

3
이것은 ^M어떤 이유로 s를 제거하지 않습니다 . 참조 파일 : /etc/timidity/fluidr3_gm.cfg.
phil294

39

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

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

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


나는 현재 버전의 Windows가 어떤 종류의 DOS 유산도 가지고 있다고 말하지 않을 것 입니다. 그러나 여전히 호환성 제한이 있습니다.
Joey

이것은 쉬운 방법입니다. 자동 변환 도구를 사용하는 것입니다. 감사합니다
Pjl

하지만 왜 ^M? 왜 '^'? 왜 'M'인가?
1737973 jul

"제어 문자"이기 때문입니다. "^"는 컨트롤 키를 클릭 한 시각적 표현입니다. 특정 바이트 아래에서 ^는 편집기가이를 나타내는 방법입니다.
Hejazzman 2015-08-05

24

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

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

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

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

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


emacs에서 어떻게 교체합니까?
herbertD

감사! VI (M) 대단합니다!
Ionică Bizău

3
^ M 문자를 입력하는 방법을 확장 해 주셔서 감사합니다! 대신 \ r로 바꾸겠습니다. 그래서 : % s / ^ M / \ r / g
aharris88 2014


10

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

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


2
^ M을 유닉스 친화적 인 줄 바꿈으로 바꾸려면 : :%s/^M/\r/g
Gary Oak

8

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

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

물론 perl을 사용할 수 있지만 dos2unix보다 perl을 제안 하시겠습니까?
Thomas Owens

2
네 사람이 이미 dos2unix를 사용한다고 말했기 때문에 나는 대안을 제공하고 있습니다.
Bill the Lizard

2
예, 저는 선사 시대 IT 부서가있는 사무실에서 일하는 역방향 워크 스테이션을 사용하고 있기 때문에이 기능이 유용하다는 것을 알았습니다. 내가 변형을 사용한 것을 제외하고 : perl -pi -e "s / \ x0D / \ n / g"file.csv
Rimian 2010

7

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

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


5
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.  

4

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)

귀하의 마지막 줄은 이전의 모든 답변에서 누락 된 것입니다. 나는 계속해서 '일치하는 것을 찾을 수 없음 bc 내가 shift + 6을하고 있었기 때문에 모든 해커가 할 수있는 일을하고 내 자신의 솔루션에 대한 내 오해를 피했다. 파일의 줄 수에 대해 매크로를 반복합니다.
darethas

3

dos2unix명령에 대한 대안 은 sed.

예를 들어, unix에 대한 dos :

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

유닉스 할 일 :

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

1

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

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

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

rm -v *.bak


0

od -a $file Linux에서 이러한 유형의 질문을 탐색하는 데 유용합니다 (위의 dumphex와 유사).


0

Perl에서 $ / 변수를 설정하지 않고 chomp ()를 사용하려면 다음을 수행 할 수도 있습니다.

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

내 2 센트


-1

수행 할 또 다른 vi 명령 : :%s/.$// 파일에서 각 줄의 마지막 문자를 제거합니다. 이 검색 및 바꾸기 명령의 단점은 마지막 문자가 무엇인지 상관하지 않는다는 것이므로 두 번 호출하지 않도록주의하십시오.


신뢰할 수 없다는 것을 알고 있다면 왜 언급합니까?
minexew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.