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

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

:%s/,/\n/g

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

어떻게해야합니까?

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



답변

\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를 삽입했습니다.


답변

요령은 다음과 같습니다.

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

:set magic

다음으로

:s/,/,^M/g

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

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

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

A : 그렇게하세요.


답변

구문에서 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.


답변

다음을 사용해야합니다.

:%s/,/^M/g

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


답변

\r 여기 당신을 위해 일을 할 수 있습니다.


답변

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


답변

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

\ 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은 파일 형식 설정에 따라 파일에 저장할 때 줄 바꿈 문자를 변환하므로 문제를 혼동 할 수 있습니다.