Vim에서 줄 바꿈으로 문자를 바꾸는 방법


1967

,현재 파일의 각 줄을 새 줄로 바꾸려고 합니다.

:%s/,/\n/g 

그러나 ^@실제 줄 바꿈 대신에 보이는 것을 삽입합니다 . 파일이 DOS 모드에 있지 않습니다.

어떻게해야합니까?

나처럼 궁금한 점이 있다면, 왜 \ ra 개행 문자가 Vim입니까? 게다가.


2
스택 오버플로는 프로그래밍 및 개발 질문을위한 사이트입니다. 이 질문은 프로그래밍이나 개발에 관한 것이 아니기 때문에 주제가 아닌 것 같습니다. 참조 내가 여기에 대해 요청할 수 있습니다 어떤 주제 도움말 센터에서. 아마도 Super User 또는 Unix & Linux Stack Exchange 가 더 좋은 곳일 것입니다.
jww

5
@ jww이 질문은 10 살입니다 ... 마이그레이션하기에는 너무 오래된 것 같습니다. 이 같은 질문을 많이 예를 들어, 다음과 같습니다 stackoverflow.com/questions/10175812/...
Vinko Vrsalovic

14
@jww vim은 프로그래머에게 일반적으로 사용되는 도구이며 프로그래머에게 일반적으로 사용되는 도구에 대한 질문은 Stack Overflow 주제에 있습니다. 분명히 이것은 Vi와 Vim 에 더 적합합니다 .
user202729 2016 년

답변:


2565

\r대신에 사용하십시오 \n.

대체 \n하여 텍스트에 널 문자를 삽입합니다. 줄 바꿈을 얻으려면을 사용하십시오 \r. 그러나 개행을 검색 할 때는 여전히을 사용 \n합니다. 이 비대칭 성은 다음 \n과 같은 사실 과 \r 약간 다른 사실 때문입니다 .

\n줄 끝 (줄 바꿈) \r과 일치하는 반면 캐리지 리턴과 일치합니다. 반면에 대체 \n에서 널 문자를 \r삽입하고 개행을 삽입합니다 (보다 정확하게는 입력으로 처리됩니다 <CR>). 다음은 Vim 명령 행 기능을 사용하여이를 설명하기위한 작은 비 대화식 예제입니다. 즉, 다음을 터미널에 복사하여 붙여 넣어 실행할 수 있습니다. xxd결과 파일의 16 진 덤프를 보여줍니다.

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

즉, \n바이트 0x00을 텍스트에 삽입했습니다. \r바이트 0x0a를 삽입했습니다.


127
/ r은 Enter / Return 키를 누르는 것으로 간주됩니다. 모든 플랫폼에서 작동합니다.
Luka Marinko


14
나는 이것이 고전적인 vi에서 효과가 있었기를 바란다. AIX v6.1에서는 \r이와 같이 작동하지 않습니다. 그러나을 Ctrl-V Enter입력하는 대신을 누르면 \r작동합니다.
eksortso

3
나는 파티에 늦었다. 경우 \r삽입 <CR>하고 \n삽입 널은 어떻게 캐리지 리턴 뭔가를 대체 할 것이다?
Mr. Llama 2016 년

2
@SunnyRaj CR과 LF의 역사에 대해 확신하십니까? 원래 LF가 용지를 한 줄 앞으로 이동했지만 프린트 헤드는 이동하지 않았으며 CR은 프린트 헤드를 이동했지만 용지는 이동하지 않았다는 인상을 받았습니다. 결과적으로, OS가 인쇄 전에 입력을 변환하지 않은 경우 LF 또는 CR 만 사용하여 올바른 출력을 얻을 수 없었습니다. MS DOS는 텍스트 파일 형식으로 원시 프린터 데이터를 사용했으며 Mac OS는 CR을 사용하여 프린터 원시 형식으로 변환했으며 UNIX는 LF를 사용하여 프린터 원시 형식으로 변환했습니다.
Mikko Rantalainen

210

요령은 다음과 같습니다.

먼저 Vi (m) 세션을 설정하여 특수 문자 (예 : 줄 바꿈)와 패턴 일치를 허용하십시오. 이 줄을 .vimrc 또는 .exrc 파일에 넣을 가치가 있습니다.

:set magic

다음으로

:s/,/,^M/g

^M문자 를 얻으려면 Ctrl+를 입력 하고을 V누르십시오 Enter. Windows에서 Ctrl+ Q,을 수행하십시오 Enter. 내가 이것을 기억할 수있는 유일한 방법은 그들이 이해하는 정도를 기억하는 것입니다.

A : 줄 바꿈을 나타내는 데 사용하는 최악의 제어 문자는 무엇입니까?

B : 어느 q(그것은 일반적 의미하기 때문에 "종료") 또는 v그렇게 쉽게 입력 할 것이기 때문에 Ctrl+ C실수로하고 편집기를 죽인다.

A : 그렇게하세요.


9
Windows에서 GVim을 사용하고 있으며 :set magic(~ / _vimrc에 있지 않음) 또는가 필요하지 않습니다 ctrl-q. 간단한 ctrl-v뒤에 enter 만 있으면 ^M문자가 잘 만들어집니다 .
Chris Phillips

5
Cv는 개행을 나타내지 않습니다. "다음 리터럴 문자 이스케이프"명령입니다. 나는 Cv가 니모닉 무엇인지 몰랐지만 정신적으로 줄 바꿈에 매핑되지 않는 이유가 있습니다.
Jim Stewart

27
Ctrl-v는 "verbatim"의 니모닉입니다. 즉, "verbatim"키 코드 / 문자로 누른 다음 키를 이스케이프합니다. Windows에서는 붙여 넣기 : 익숙한 것을 유지합니다. Ctrl-Q는 "(un) Quote"용입니다. 어쨌든 꽤 어리석은 일이지만 바이너리 파일에서 사용할 수 있습니다 (예 : Ctrl-Z를 통해 Ctrl-A 검색 (Ascii 1-26)).
Tomasz Gandor

1
Ctrl-C표준 모드로 되돌릴 수는 있지만 실제로 편집기를 종료하지는 않습니다. Ctrl-V의미 그대로, Ctrl-Q누군가 $VIMRUNTIME/mswin.vim구성 파일 을로드하는 실수를했다는 의미입니다 . mswin이 필요하지 않습니다. 대신 자신의 vimrc를 사용하십시오.
00dani

와우 ---- 놀랍습니다. 나는 sed -n l 지금까지했었다. Ctrl-vvim 에서도 마찬가지 입니다.
Arpit

98

구문에서 s/foo/bar, \r\n문맥에 따라 다른 의미를 갖는다.


짧은:

의 경우 foo:

\ n = 줄 바꿈 (Linux / Mac의 경우 LF, Windows의 경우 CR + LF)
\ r = 캐리지 리턴 (CR)

의 경우 bar:

\ r =는 줄 바꿈입니다.
\ n = null 바이트입니다.

더 긴 (ASCII 번호 사용) :

NUL= 0x00 = 0 = Ctrl+ @
LF= 0x0A = 10 = Ctrl+ J
CR= 0x0D = 13 = Ctrl+M

다음은 ASCII 제어 문자 목록입니다 . Ctrl+ V, Ctrl+ 를 통해 Vim에 삽입하십시오 ---key---.

Bash 나 다른 유닉스 / 리눅스 셸에서 Ctrl+ 만 입력하십시오 ---key---.

Bash에서 Ctrl+ M를 사용해보십시오 . 그것은 타격과 동일합니다 Enter쉘이 무엇을 의미하는지 알게 리눅스 시스템은 라인의 경계 설정을위한 라인 피드를 사용하더라도.

bash에 리터럴을 삽입하려면 Ctrl+ V를 앞에 붙이십시오 .

배쉬에서보십시오 :

echo ^[[33;1mcolored.^[[0mnot colored.

이것은 ANSI 이스케이프 시퀀스를 사용 합니다 . 두 삽입 ^['을 통해에요 Ctrl+ V, Esc.

Ctrl+ V, Ctrl+ M, 시도해 볼 수도 있습니다 Enter.

bash: $'\r': command not found

\r위에서 기억 하십니까? :>

ASCII 제어 문자 목록은 완전한 ASCII 기호 표 와 다릅니다. Ctrl키 (haha) 를 통해 콘솔 / 의사 터미널 / Vim에 삽입 된 제어 문자를 찾을 수 있다는 점입니다.

C 및 대부분의 다른 언어에서는 일반적으로 8 진 코드를 사용하여 이러한 '문자'를 나타냅니다.

이 모든 것이 어디서 나오는지 정말로 알고 싶다면 TTY demystified . 이것은 당신이이 주제에 관해 알게 될 가장 좋은 링크이지만주의하십시오 : 용이 있습니다.


TL; DR

일반적으로 foo= \nbar= \r.


1
그래서 나는 당신이 캐리지 리턴으로 캐릭터를 대체하는 방법에 흥미가 있습니다
codeshot

2
@codeshot 이해 :s/x/^M/g야합니다. ^M비아 ctrl-v다음에을 삽입하십시오 ctrl-m.
sjas

3
고마워요, 당신은이 질문이 가장 이상한 중 하나라는 것을 알고 있습니다. 1008은 기본적으로 "vim이 찾은 것을 수행합니다. vim이 찾은 것을 수행하기 때문입니다. vim이 찾은 것을 수행한다는 것을 잊지 마십시오." 패턴의 흥미로운 캐릭터, 대체 및 이상한 이유에 대한 짧은 코드 목록을 찾아서 다른 유사한 이상한 것을 기억하고 예측하기를 희망했습니다. 그게 내 투표권을 얻었을 것이다.
codeshot

@codeshot ascii 제어 문자 목록이 도움이 될 수 있습니다. 자세한 내용은 cs.tut.fi/~jkorpela/chars/c0.html 을 참조하십시오. 두 개의 링크를 포함하도록 답변을 업데이트하겠습니다.
sjas

55

다음을 사용해야합니다.

:%s/,/^M/g

^M문자 를 얻으려면 Ctrl+ v와을 차례로 누릅니다 Enter.


4
^ M 문자를 얻으려면 <Cv> <Cm>을 수행해야합니다.
Jezen Thomas


24

Windows에서 Vim을 사용하는 경우 Ctrl+ Q대신 Ctrl+를 사용하십시오 V.


16

이것은 내가 생각하는 방식에 가장 적합한 대답이지만 테이블에서 더 좋을 것입니다.

\ ra 줄 바꿈이 Vim에 왜 필요한가요?

다시 말하면 :

당신은 사용할 필요가 \r라인 피드 (ASCII 사용하는 0x0A정규식 교체에, 유닉스 줄 바꿈),하지만 교체 특유 - 일반적으로 사용하는 기대를 계속해야 \n줄 바꿈과 \r캐리지 반환.

이는 Vim이 \n대체 문자로 NIL 문자 (ASCII 0x00) 를 의미 하기 때문 입니다. \0대신 NIL \n이 일반적으로 줄 바꿈에 일반적으로 사용 되도록 해주었을 것으로 예상 했지만 \0이미 정규식 대체에 의미가 있으므로로 변경되었습니다 \n. 따라서 다음과 같은에서 개행을 이동하는 상기 예정 \n\r(이 정규식 패턴 캐리지 리턴 문자, ASCII이다 0x0D).

캐릭터 | ASCII 코드 | C 표현 | 정규식 경기 | 정규식 교체
------------------------- + ------------ + ------------- ------- + ------------- + ------------------------
무 | 0x00 | \ 0 | \ 0 | \엔
줄 바꿈 (Unix 줄 바꿈) | 0x0a | \ n | \ n | \아르 자형
캐리지 리턴 | 0x0d | \ r | \ r | <알 수 없음>

NB : ^M( Linux의 경우 Ctrl+ V Ctrl+ M)는 다른 사람들이 권고 한 것처럼 캐리지 리턴 대신 정규식 교체에 사용될 때 줄 바꿈을 삽입합니다 (방금 시도했습니다).

또한 Vim은 파일 형식 설정에 따라 파일에 저장할 때 줄 바꿈 문자를 변환하므로 문제를 혼동 할 수 있습니다.



8

그러나 대체 해야하는 경우 다음이 작동합니다.

:%s/\n/\r\|\-\r/g

위의 모든 다음 줄은 다음 줄로 바뀐 다음 |-새 줄로 다시 바뀝니다. 위키 테이블에서 사용됩니다.

텍스트가 다음과 같은 경우 :

line1
line2
line3

로 변경됩니다

line1
|-
line2
|-
line3

7

전체 파일에 대해 수행 해야하는 경우 명령 줄에서 시도해 볼 수도 있습니다.

sed 's/\\n/\n/g' file > newfile

1
여기에는 GNU sed가 필요합니다. 시도 printf 'foo\\nbar\n' | sed 's/\\n/\n/g'는 시스템에서 작동하는지 확인합니다. (이 제안에 대한 Freenode의에 #bash의 좋은 사람들에게 감사드립니다.)
에반 도노반

네,하지만 문제는 Vim에 관한 것이 었습니다. 스택 오버플로 질문이 있습니다. sed를 사용하여 줄 바꿈 (\ n)을 바꾸려면 어떻게해야합니까? .
피터 Mortensen

5

나를 위해 일한 대답은 다음과 같습니다. 이 사람으로부터 :

---- quoting vi 편집기를 사용하여 바꾸기에 줄 바꿈 문자를 삽입하십시오.


내가해야 할 일이 있고 기억하지 못하고 찾아야 할 것이 있습니다.

vi에서 검색에 줄 바꾸기 문자를 삽입하고 바꾸려면 다음을 수행하십시오.

:%s/look_for/replace_with^M/g

위의 명령은“look_for”의 모든 인스턴스를“replace_with \ n”(\ n은 개행 문자)으로 바꿉니다.

"^ M"을 얻으려면 키 조합 Ctrl+을 입력 V한 다음 (모든 키 해제) Enter키를 누릅니다.


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