it-swarm-ko.tech

Vim에서 개행 문자를 대체하는 방법

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

:%s/,/\n/g 

그러나 실제 줄 바꿈 대신 ^@처럼 보이는 것을 삽입합니다. 파일이 DOS 모드 또는 다른 형식이 아닙니다.

어떻게해야합니까?

궁금하다면, 나 같은 질문을 확인하십시오. {왜 Vim의 줄 바꿈입니까?.

1755
Vinko Vrsalovic

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

\n로 대체하면 텍스트에 null 문자가 삽입됩니다. 줄 바꿈을하려면 \r를 사용하십시오. 개행에 대해 검색 을하면, 여전히 \n를 사용합니다. 이 비대칭은 \n\r약간 다른 일을 함 에 기인합니다 :

\n는 행의 끝 (개행)과 일치하지만 \r는 캐리지 리턴과 일치합니다. 반면에 \n는 null 문자를 삽입하고 \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 바이트가 삽입되었습니다.

2317
Konrad Rudolph

그 트릭은 다음과 같습니다.

먼저 vi (m) 세션을 특수 문자 (예 : 개행)와의 패턴 일치를 허용하도록 설정하십시오. 이 줄을 .vimrc 또는 .exrc 파일에 넣는 것이 좋습니다.

:set magic

다음을 수행하십시오.

:s/,/,^M/g

^M 문자를 가져 오려면 다음을 입력하십시오. Control-v 쳤다. Enter. Windows 환경에서 Control-qEnter. 내가 이것을 기억할 수있는 유일한 방법은 그들이 얼마나 작은 감각을 가지고 있는지를 기억하는 것이다.

A : 개행을 나타내는데 가장 나쁜 제어 문자는 무엇이겠습니까?

B : 입력이 쉽기 때문에 q (보통 "Quit"을 의미하기 때문에) 또는 v Control-c 실수로 편집기를 죽인다.

A : 그렇게 만드십시오.

184
Logan

s/foo/bar 구문에서 \r\n는 다른 의미를 가지며 상황에 따라 다릅니다.


짧은:

foo :
\n = 개행 (linux/mac의 경우 LF, Windows의 경우 CRLF)
\r = 캐리지 리턴 (CR)

bar :
\r은 줄 바꿈입니다.
\n = null 바이트.

긴 : (아스키 번호 포함)

NUL = 0x00 = 0 = CTRL@
LF = 0x0A = 10 = CTRLJ
CR = 0x0D = 13 = CTRLM

다음은 ASCII 제어 문자 의 목록입니다. via vim을 통해 CTRLvCTRL---key---.
bash 또는 다른 유닉스/리눅스 쉘에 다음을 입력하십시오. CTRL---key---. 시험 CTRLM bash에서는 타격과 동일합니다. ENTER리눅스 시스템이 줄 바꿈을 위해 줄 넘김을 사용하더라도 쉘은 의미가 무엇인지 알게됩니다.

리터럴을 bash에 삽입하려면 CTRLv 또한 작동합니다.

Bash로 시도해보십시오.

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

이것은 ANSI 이스케이프 시퀀스 를 사용하여 두 개의 ^[을 삽입합니다. CTRLvESC.

시도해 볼 수도 있습니다. CTRLvCTRLmENTER, 이것은 당신에게 이것을 줄 것이다 :

bash: $'\r': command not found

위에서 \r를 기억 하시겠습니까? :>

ASCII 제어 문자 list는 완전한 ASCII 기호 표 와는 다르다. 즉, 콘솔/pseudoterminal/vim에 삽입되는 제어 문자가 CTRL 키 (하하)를 찾을 수 있습니다. 반면 C와 다른 대부분의 언어에서는이 '문자'를 나타내는 데 8 진수 코드를 사용합니다.

이 모든 것이 어디서 발생하는지 정말로 알고 싶다면 http://www.linusakesson.net/programming/tty/ .
이것은 당신이이 주제에 관해 알게 될 최고의 링크이지만 조심하십시오 : 용들이 있습니다.


TL; DR

보통 foo = \nbar = \r.

84
sjas

너는 다음을 사용해야한다.

:%s/,/^M/g

^M 문자를 얻으려면 Ctrlv 뒤이어 Enter

50
dogbane

\r는 여기서 일할 수 있습니다.

33
Lasar

Windows에서의 Vim 사용 Ctrl+Q 대신에 Ctrl+V

22
grantc

이것은 내가 생각하는 방식에 대한 최상의 대답이지만 테이블에서 더 좋았을 것입니다 : https://stackoverflow.com/a/12389839/962394 .

그래서, rewording :

정규 표현식에서 줄 바꿈 (ascii \r, 유닉스 개행 문자)을 사용하려면 0x0a를 사용해야하지만 대체로 특유한 것입니다. 일반적으로 줄 바꿈에 \n를 사용하고 캐리지 리턴에는 \r를 계속 사용해야합니다.

이것은 vim이 대체에서 \n를 사용하여 NIL 문자 (ascii 0x00)를 의미하기 때문입니다. NIL이 대신에 \0를 사용하여 줄 바꿈을 할 때 \n를 해제 할 것으로 예상 했었지만 \0은 이미 정규 표현식에서 의미를 가지므로 \n로 옮겨졌습니다. 그러므로 줄 바꿈을 \n에서 \r로 바꾼다. (이것은 정규 표현식에서 캐리지 리턴 문자 인 ascii 0x0d이다.).

 캐릭터 | 아스키 코드 | C 표현 | 정규식 일치 | 정규 표현식 대체 
 ------------------------- + ------------ + ---- -------------- + ------------- + --------------------- --- 
 nil | 0x00 |\0 |\0 |\n 
 줄 바꿈 (unix 줄 바꿈) | 0x0a |\n |\n |\r 
 캐리지 리턴 | 0x0d |\r |\r | <unknown> 

NB : ^M (Linux의 경우 Ctrl-V Ctrl-M)는 다른 사람들이 (내가 방금 시도한) 충고보다는 캐리지 리턴 대신 정규 표현식에서 사용할 때 개행을 삽입합니다.

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

10
codeshot

Eclipse에서 ^M 문자는 한 줄에 포함될 수 있으며이를 개조 문자로 변환하려고합니다.

:s/\r/\r/g
10
rickfoosusa

하지만 다음 작품을 대체해야한다면

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

위의 모든 행은 다음 행으로 대체 된 후 | - 그리고 다시 다음 행으로 대체됩니다. 이것은 wiki 테이블에서 사용됩니다. 텍스트가 다음과 같은 경우 :

line1
line2
line3

변경됨

line1
|-
line2
|-
line3
7

전체 파일을 처리해야하는 경우 명령 줄에서 시도해 볼 수도 있다고 제안되었습니다.

sed 's/\\n/\n/g' file > newfile
6
Evan Donovan

나를 위해 일한 해답을 얻습니다. 이 녀석에게서

---- quoting http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


뭔가 다른 일을해야하고 기억할 수 없으며 그 다음 위로 올려야합니다.

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

: % s/look_for/replace_with ^ M/g 위 명령은 "look_for"의 모든 인스턴스를 "replace_with\n"(\ n은 개행을 의미 함)으로 대체합니다.

"^ M"을 얻으려면 키 조합 "ctl-V"를 입력 한 다음 (모든 키를 놓은 후) "enter"키를 누릅니다.


4
user407749