vim에서 열린 파일에서 ^ M 줄 바꿈을 '일반'줄 바꿈으로 변환하는 방법은 무엇입니까?


481

모든 줄에 vim이 표시됩니다 ^ M

이것을 '정상적인'줄 바꿈으로 바꾸려면 어떻게합니까?



3
가장 깨끗한 솔루션이므로 솔루션을 파일 형식 변경으로 변경 하십시오.
erikbwork

1
나는이 질문이 vim에 관한 것이라는 것을 알고 있지만 다른 Google 검색 도이 스레드에 들어갑니다. 따라서 시스템에 Eclipse를 설치 한 경우 몇 번의 클릭만으로 단일 파일 또는 파일의 전체 폴더 트리에 대한 행 구분 기호를 변환 할 수 있습니다. stackoverflow.com/a/7019737/1364747
Teddy

^ M 줄 바꿈과 달리 일반적인 줄 바꿈을 "정상"이라고 부르는 방법이 마음에
듭니다.

답변:



577

명령

:%s/<Ctrl-V><Ctrl-M>/\r/g

여기서 <Ctrl-V><Ctrl-M>type Ctrl+ Vthen Ctrl+를 의미합니다 M.

설명

:%s

대체, % = 모든 줄

<Ctrl-V><Ctrl-M>

^ M 문자 (Ctrl-V는 Ctrl ^ 문자를 작성하는 Vim 방식이며 Ctrl-M은 정규 표현식 다음에 M을 기록하여 ^ M 특수 문자)

/\r/

줄 바꿈 ( \r)

g

그리고 전 세계적으로 수행하십시오.


21
^ M 문자를 제거했지만 캐리지 리턴을 삽입하지 않습니다.
luckytaxi

14
@jumpnett-키 코드를 Ctrl-V / Ctrl-M으로 눌러야합니다.
LeopardSkinPillBoxHat

33
이것은 ^ M 뒤에 새 줄이 있으면 줄 바꿈을 유지하고 싶지만 ^ M을 제거하려는 질문에 대한 정답입니다. 아래의 다른 대체를 수행하면 파일이 두 줄 간격으로 배치됩니다.
dlamblin

12
캐리지 리턴이 여전히 누락 된 경우 (예 : ^ M은 제거되었지만 모든 것이 한 줄로 줄 바꿈) 다음을 수행하십시오. :%s/<Ctrl-V><Ctrl-M>/\r/g여기서 \ r은 ^ M을 줄 바꾸기로 바꿉니다.
William Turrell

7
Windows에서 Vim을 실행중인 경우 <Ctrl-V> 대신 <Ctrl-Q>를 사용해야합니다.
GrandAdmiral

418

Linux 및 Mac OS에서 다음이 작동합니다.

:%s/^V^M/^V^M/g

여기서 ^V^M수단 형 Ctrl+ V다음 Ctrl+ M.

참고 : Windows 에서는 기본적으로 텍스트를 붙여 넣기 위해 매핑 되므로 ^Q대신 대신 을 사용하려고 합니다.^V^V


3
왜 이것이 공감대를 얻었습니까? 파일의 줄 끝이 잘못되어 파일이 한 줄로 으깨 져도 작동합니다.
Paul Tomblin

2
내 길은 파일의 줄 끝을 올바른 줄 끝으로 바꿉니다.
Paul Tomblin

7
파일에 새로운 줄이 없을 때 다른 문제가 발생합니다. 더 일반적입니다. 참고 ^ M은 \ r에 일치 할 수있다
dlamblin

12
이것은 매우 신비한 명령이지만 Mac에서는 저에게 효과적입니다.
Eric Walker

5
%s/\r/\r/gMacVim ^M에서 줄 끝에 만 표시되는 파일 (MacVim 용어에서 하나의 긴 줄)에 대해 동등한 기능을 발견 했습니다 . 분명히 \ r은이 명령의 대체 부분과 패턴에서 다른 것을 의미합니다.
RichVel

184

에서 vimDOS 또는 Unix 파일 형식을 확인하십시오.

:set filetype=unix

:set fileformat=unix

캐리지 리턴 (CR, ^ M) 문자없이 파일이 다시 쓰여집니다.


3
use : set fileformat = unix 대부분의 구성 파일 유형에서 사용되는 구문 유형 만 변경합니다.
derGral

6
이것은 내가 가진 버그를 수정했습니다 ... Vim은 UNIX 형식의 파일이 Windows라고 생각하기 시작했고 새로 변경된 줄이 git diff에 ^ M을 표시하고 있습니다.
Thomas Hunter II

시스템에 의존해야합니다. 오늘이 일했습니다. set 명령은 vim, btw 내에서 수행됩니다.
gbarry

1
파일
포맷이 dox

3
이것은 또한 BTW VI에서 작동, 당신은 할 수 set ff=unix동일한 방법으로 약간의 바로 가기로 ft바로 가기입니다filetype
Posva

110

MacVim 에서 볼 수있는 BBEdit으로 만든 파일 ^M은 일반 파일 대신 여러 줄을 표시했습니다 . 다음 문자열 대체로 문제가 해결되었습니다. 도움이 되었기를 바랍니다.

:%s/\r/\r/g

줄 바꿈을 같은 문자로 대체하기 때문에 흥미 롭지 만 Vim이 올바르게 표시하려면 신선한 \ r을 가져와야한다고 가정합니다. 왜 이것이 작동하는지에 대한 기본 메커니즘을 알고 싶습니다.


1
검색 기능이 줄 끝 시퀀스를 인식하기 위해 더 넓은 규칙을 받아들이는 경향이 있습니다. 그러나 \ r은 데이터로 쓰여질 때 특별한 의미가 있습니다.
gbarry

이것은 Windows gVim에서 줄 바꿈이없는 파일을 정렬하는 대신 ^^을 많이 사용했습니다.
플래시

2
이 페이지에서 제공되는 모든 솔루션 중에서 이것은 csv 파일에서 ^ M을 제거하는 데 도움이 된 유일한 패턴이었습니다. MacVim 사용하기.
B6431

+1 Mobaterm을 사용하여 Windows에서 Ubuntu Trusty에 SSH로 연결하는 동안 저를 위해 일했습니다
Carl

따라서 이것은 대체로 지정하더라도 모든 \r문자 를 대체하는 것처럼 보였습니다 . 불평하지 않고 정확히 내가 원하는 것입니다. 그냥 이상해 \n\r
도넛

34

먼저 :set ff?파일 형식을 알아내는 데 사용 하십시오.

unix문제가 될 수 있습니다 . 문제는 파일이 fileformat=dos줄 끝에 "^ M ^ J"를 추가하여 만들어 졌지만 줄 끝 flieformat=unix에서 "^ J"를 제거하고 "^ M"을 남겨두고 읽은 것입니다.

:e ++ff=dosVim 명령 행에 입력하면 파일 형식을 유닉스에서 할일로 변경할 수 있습니다. 문제를 해결해야합니다. 그렇지 않은 경우 :%s/\r//g도움이 될 것입니다.


3
나는 둘 다해야했다. :e ++ff=dos다음 :set ff=unix:w
최대

29

^ M 문자를 일치시키기 위해 시각적으로 선택하고 OS copy to clipboard 명령을 사용하여 검색해야했습니다. replace 명령을 시도하기 전에 문자를 검색하여 테스트 할 수 있습니다.

/^M

첫 번째 불량 라인을 선택해야합니다

:%s/^M/\r/g

모든 잘못된 ^ M을 캐리지 리턴으로 바꿉니다.

이것은 gvim 7을 기반으로하는 MacVim의 기능입니다.

편집하다:

Windows 용 Ubuntu가있는 Windows 10 컴퓨터에서이 문제가 다시 발생하면 vim의 파일 형식 문제가 발생한다고 생각합니다. 이 경우 ff를 unix, mac 또는 dos로 변경하면 ^ M을 ^ J로 변경했다가 다시 되 돌리는 것 외에는 아무것도하지 않습니다.

이 경우의 해결책 :

:%s/\r$/ /g
:%s/ $//g

내가이 경로를 선택한 이유는 파일을 손상시키지 않기를 원했기 때문입니다. 나는 할 수 :%s/\r$//g있었지만 캐리지 리턴을 즉시 삭제했으며 예기치 않은 결과가 발생했을 수 있습니다. 대신 단일 CR 문자 (여기서는 ^ M 문자)를 공백으로 변환 한 다음 줄 끝의 모든 공백을 제거합니다 (나에게있어 바람직한 결과는 아닙니다)

오래 전에 답변 된 오래된 질문을 되새겨 줘서 미안하지만 혼란스러워 보였고 이것이 Google 검색에서 높은 것으로 나타났기 때문에 그 중 일부를 정리하는 데 도움이 될 것이라고 생각했습니다.


1
ctrl-v를 누르면 ctrl-m을 사용하여 문자를 삽입 할 수 있습니다. 그러나 \ r은 올바른 캐리지 리턴을 삽입하는 것입니다.
Metagrapher

1
이것이 정답입니다. 위에서 말했듯이 <ctrl-v> <ctrl-m>을 사용하여 리터럴 ^ M을 명령에 삽입하십시오.
carlosayam

1
원본 게시 시점에 저에게 도움이된다면 게시하지 않았을 것입니다. ;)
Metagrapher

22

이 중 어느 것도 나를 위해 일하지 않았으므로 이것을 시도해 보았습니다.

유형 :%s/

프레스 CTRL-VCTRL-M

유형 //g

프레스 Enter

따라서 Vim shoud의 전반적인 명령은 다음과 같습니다. :%s/^M//g

이것이하는 일 : :%s(찾기 및 바꾸기) /^M/(기호 /없음) g(전역 적으로).


쾅! Mac에서 작동합니다.
shamail


15

Ctrl을 사용할 필요가 없습니다. :%s/\r$//


1
이것이 내가하는 방법입니다. 난 그냥 명령을 기억하지 않습니다
pixel 67

이러한 결말을 제거하는 것이 좋습니다.
Metagrapher


12

나는 이것을 sed와 함께했다 :

sed -i -e 's/\r/\n/g' filename


이것이 효과가 있습니까? OSX에서 : sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand

예, 작동합니다 (많이 사용합니다) .OSX에서 sed의 GNU 버전이 설치되어 있지 않으면 작동하지 않을 수 있습니다. Apple이 기본적으로 제공하는 sed 버전은 모든 Linux 배포판에 제공되는 GNU 버전과 크게 다릅니다 (슬프게도). 추가 도움이 필요하면이 질문에 대한 답변을 확인하십시오. stackoverflow.com/q/30003570/2062384
Freedom_Ben

감사합니다 @Freedom_Ben. 따라서 이것이 OS에서는 작동 sed하지만 BSD 에서는 작동 하지 않는 것 같습니다 sed. 줄 바꿈을 수정하는 사람은 아마도 여러 운영 체제와 함께 작동 할 것이므로 답이 언제 작동하는지 명확하게 이해하는 것이 좋습니다.
Armand

10

어떻습니까 : :%s/\r//g 그것은 저에게 완전히 효과가있었습니다.

이것이하는 것은 모든 줄의 끝을 청소하는 것입니다. ^ M을 제거하면됩니다.


9

이 질문에 대한 다른 답변이 많이 있지만 여전히 명령 줄 솔루션이 필요하므로 다음이 가장 효과적입니다.

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

설명:

  • .vimrc 파일을로드하지 않은 상태에서 myfile
  • :e ++ff=dosdos 줄 끝으로 전체 파일을 강제로 다시로드하려면 실행하십시오 .
  • :w ++ff=unix유닉스 줄 끝을 사용하여 파일을 작성하기 위해 실행
  • vim 종료

3
감사합니다! 이것은 내 문제를 해결하고 스크립트에서 사용하는 것이 유용하다는 것을 알았습니다.
Peddipaga

8

Ctrl+는 M내 창을 최소화하지만 Ctrl+는 Enter실제로 삽입 ^M문자. 또한 Ctrl프레스 사이 에 키 를 들어 올리지 않도록해야했습니다 .

그래서 나를위한 해결책은 다음과 같습니다.

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

경우 <Ctrl-V><Ctrl-Enter>에 수단 길게 누름 Ctrl , 언론 자료 V, 언론과 릴리스 Enter, 다음 릴리스 Ctrl .

Windows 생성 파일로 작업중인 경우

위의 솔루션은 기존 행 사이에 추가 행을 추가 \r합니다 ^M.

이를 방지하기 위해 ^M문자를 바꾸지 않고 삭제하려고 합니다.

:%s/<Ctrl-V><Ctrl-Enter>//g

여기서 %"이 버퍼에서" s는 "대체"를 /의미하고, "(다음과 같은 패턴 찾기")를 <Ctrl-V><Ctrl-Enter>의미합니다. ^M문자 를 얻기 위해 누르는 키 (위 참조), //"아무것도 없음"(또는 "패턴 있음" 이 두 슬래시 사이 (비어 있음 ")이며 행에서 처음 나타나는 것과 반대로"전역 적으로 "를 의미 g하는 플래그 입니다.


7

이것은 나를 위해 일했다 :

  1. 파일 형식을 유닉스로 설정 ( \n줄 끝)
  2. 파일을 저장

vim에서 :

:set ff=unix
:w

1
이 답변은 나를 위해 일했지만 수락 된 답변은 그렇지 않았습니다.
Marcello Romani

7

나의 경우에는,

위의 아무것도 작동하지 않았으며, Mac에서 Linux 컴퓨터로 CSV 파일을 복사했으며 위의 모든 명령을 사용했지만 아래의 것 외에는 아무런 도움이되지 않았습니다.

tr "\015" "\n" < inputfile > outputfile

^ M 문자가 다음과 같은 줄 사이에 샌드 스위치 된 파일이 있습니다.

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,

5

또는 dos2unix 및 unix2dos라는 오픈 소스 유틸리티가 있으며이 작업을 수행 할 수 있습니다. 리눅스 시스템에서는 아마도 기본적으로 설치 될 것입니다. Windows 시스템의 경우 http://www.bastet.com/ 에서 다운로드 할 수 있습니다.


5
sed s/^M//g file1.txt > file2.txt

여기서 ^ M은 3 개의 키를 동시에 눌러 입력합니다. ctrl + v + m


4

파일이 Windows에서 작성된 경우 dos2unix 유틸리티를 사용하고, 파일이 mac에서 작성된 경우 mac2unix 유틸리티를 사용하십시오. :)


전에 mac2unix에 대해 들어 본 적이 없다면, 다시 할 수 있다면 다시 찬성했습니다!
Kuf

허 레이! 이것은 갈 길입니다!
Private



1

키 입력저장 하기 위해 매핑에 Ctrl+ VCtrl+ M를 입력하지 않아도됩니다 . ^ M 문자가 포함 된 파일을 열고 yan 어 .vimrc에 다음과 같은 행에 붙여 넣으십시오.

nnoremap <Leader>d :%s/^M//g<CR>

1

^Mvim과 eclipse로 작업하는 동안 줄 바꿈을 많이 받으면 이러한 제안 중 어느 것도 효과가 없었습니다 . 나는 외부 사건을 겪었다 고 생각하지만 내가 한 사람에게 도움이 될 경우를 대비하여.

:%s/.$//g

그리고 그것은 내 문제를 정리했다


줄 끝에서 모든 문자를 제거합니다. 어떤 이유로 ^ M으로 끝나지 않은 행이 있으면 해당 문자도 제거하므로 예상치 못한 결과가 발생합니다. 이것은 사실이 아니어야하지만, 그럴 경우,이를 모르는 경우 파일을 식별하기 매우 어려운 방법으로 파일을 설득 할 수 있습니다.
Metagrapher

1
:g/^M/s// /g

^M사용하여 입력 하면 Shift+6 Caps+M수락되지 않습니다.

을 입력해야합니다 ctrl+v ctrl+m.


1

^M원치 않는 줄 바꿈을 제공합니다. 이를 처리하기 위해 sed다음과 같이 명령을 사용할 수 있습니다 .

sed 's/\r//g'

idk 왜 sed를 사용하기 때문에 -1로 하향 투표 되었습니까? 당신은 vim 안에서 같은 대체를 할 수 있고 작동 해야 합니다
Metagrapher

1

set binary.vimrc에서 제거 하십시오!


다른 하나의 스레드에서 "set binary"는 새 줄의 자동 삽입을 제거하는 것이 좋습니다.
dexter2305

1

sedMacOS에서 사용하려면 다음을 수행하십시오.

sed -i.bak $'s/\r//' <filename>

설명 :$'STRING' 여기 의 구문은 bash 쉘과 관련이 있습니다. Mac은 \r특수 문자로 취급되지 않습니다 . 명령 문자열을 인용하면 $''쉘에 ANSI-C 표준에 지정된 \r실제 \r문자 로 바꾸라고 지시합니다.


0

"이 기능은 점프 목록을 유지합니다

fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
    set ff=unix
    w!
    "%s/\%x0d$//e
catch /E32:/
    echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()

이 경우 * NIX의 고유 dos2unix 명령을 사용하면 어떤 문제가 있습니까? linux.die.net/man/1/dos2unix
Metagrapher

0

나는 오후 \ n ctrl-v 012 (두 가지 모두 null을 제공함)로 고투하는 오후를 보냈습니다. 내가이 기사를 작성하기 전까지이 스레드를 통해 작업했습니다.

\r 나를 위해 잘 작동했습니다!

/),/s/),/)\r/g

다음과 같이 설정했습니다.

블랙리스트-추가 : i386 (0.4.1, 0.4.1 + nmu1), libmount1 : i386 (2.20.1-5.1, 2.20.1-5.2), libblkid1 : i386 (2.20.1-5.1, 2.20.1-5.2) , libapt-pkg4.12 : i386 (0.9.7.4, 0.9.7.5), nmap : i386 (6.00-0.1, 6.00-0.2), libsane-common : i386 (1.0.22-7.3,

이런 식으로 :

26 libwv-1.2-4 : i386 (1.2.9-3, 자동)
27 openjdk-6-jre-headless : i386 (6b24-1.11.4-3, 자동)
28 jed : i386 (0.99.19-2.1)

마법. 나는 진심으로 감사합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.