etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 12. 2. 00:26
반응형

질문자 :Vinko Vrsalovic


나는 각을 대체하기 위해 노력하고있어 , 새로운 라인으로 현재 파일 :

 :%s/,/\n/g

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

어떻게 해야 하나요?

나처럼 궁금한 점이 있으면 \ra가 Vim의 줄 바꿈인 이유를 확인하세요. 또한.



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

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


Konrad Rudolph

비결은 다음과 같습니다.

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

 :set magic

다음을 수행합니다.

 :s/,/,^M/g

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

A: 개행을 나타내는 데 사용할 수 있는 최악의 제어 문자는 무엇입니까?

B: q (보통 "종료"를 의미하기 때문에) 또는 v 중 하나입니다. 실수로 Ctrl + C 를 입력하고 편집기를 죽이기 쉽기 때문입니다.

A: 그렇게 하세요.


Logan

s/foo/bar 구문에서 \r\n 은 컨텍스트에 따라 다른 의미를 갖습니다.


짧은:

foo 위해:

\r == "캐리지 리턴"( CR / ^M )
\n == Linux/Mac에서는 "줄 바꿈"( LF CRLF 와 일치합니다.

bar :

\r == Linux/Mac LF , Windows CRLF
\n == "널 바이트"( NUL / ^@ )

Windows 환경에서 처음 생성되고 업로드된(예: FTP/SFTP) Linux(예: 웹 서버)에서 파일을 편집할 때 - vim에 표시되는 ^M 은 Linux에서 번역하지 않는 CR 줄 바꿈을 나타 LF 만 사용합니다.


더 긴(ASCII 숫자 포함):

NUL == 0x00 == 0 == Ctrl + @ == ^@ vim에 표시됨
LF == 0x0A == 10 == Ctrl + J
CR == 0x0D == 13 == Ctrl + M == ^M 이 vim에 표시됨

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

Bash 또는 다른 Unix/Linux 셸에서는 Ctrl + ---key--- 를 입력하기만 하면 됩니다.

Bash에서 Ctrl + M 을 시도하십시오. Linux 시스템이 줄 구분을 위해 줄 바꿈을 사용하더라도 셸이 의미하는 바를 깨닫기 때문에 Enter 키 를 누르는 것과 같습니다.

bash에 리터럴을 삽입하려면 Ctrl + V를 앞에 추가하는 것도 작동합니다.

Bash에서 시도:

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

이것은 ANSI 이스케이프 시퀀스를 사용합니다. Ctrl + V , Esc 를 통해 두 개의 ^[ 삽입하십시오.

Ctrl + V , Ctrl + M , Enter 를 시도할 수도 있습니다. 그러면 다음이 제공됩니다.

 bash: $'\r': command not found

\r 을 기억하십니까? :>

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

반면 C 및 대부분의 다른 언어에서는 일반적으로 이러한 '문자'를 나타내기 위해 8진수 코드를 사용합니다.

이 모든 것이 어디서 왔는지 정말로 알고 싶다면: The TTY demystified . 이것은 이 주제에 대해 접하게 될 최고의 링크이지만 주의하십시오. 드래곤이 있습니다.


TL;DR

일반적으로 foo = \nbar = \r 입니다.


sjas

다음을 사용해야 합니다.

 :%s/,/^M/g

^M 문자를 얻으려면 Ctrl + v 를 누른 다음 Enter를 누르십시오 .


dogbane

\r 여기에서 작업을 수행할 수 있습니다.


Lasar

Windows의 Vim에서는 Ctrl + V 대신 Ctrl + Q 를 사용합니다.


grantc

이것은 내가 생각하는 방식에 대한 최선의 답변이지만 테이블에서 더 좋았을 것입니다.

Vim에서 \ra가 개행인 이유는 무엇입니까?

그래서, 다시 말해서:

정규식 대체에서 줄 바꿈(ASCII 0x0A , Unix 개행)을 사용하려면 \r 을 사용해야 하지만 이는 대체에 고유합니다. 일반적으로 줄 바꿈 \n 을, 캐리지에는 \r 반품.

0x00 )를 의미하기 위해 대체에 \n 을 사용했기 때문입니다. \0 대신 줄 바꿈에 대한 일반적인 사용을 위해 \n 을 해제할 것으로 예상했을 수 \0 은 정규식 대체에서 이미 의미가 있으므로 \n 으로 이동했습니다. 따라서 개행을 \n 에서 \r (정규식 패턴에서 캐리지 리턴 문자 ASCII 0x0D )으로 이동합니다.

캐릭터 | 아스키 코드 | C 표현 | 정규식 일치 | 정규식 대체
-------------------------+------------+----------- -------+-------------+------------------------
없음 | 0x00 | \0 | \0 | \N
줄 바꿈(Unix 개행) | 0x0a | \n | \n | \NS
캐리지 리턴 | 0x0d | \r | \r | <불명>

주의: ^M ( Linux의 경우 Ctrl + V Ctrl + M )은 다른 사람들이 조언한 대로 캐리지 리턴이 아닌 정규식 대체에 사용될 때 개행을 삽입합니다(방금 시도했습니다).

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


codeshot

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

 :s/\r/\r/g

rickfoosusa

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

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

위에서 모든 다음 라인은 다음 라인으로 대체되고 |- 그리고 다시 새 라인으로 대체됩니다. 이것은 위키 테이블에서 사용됩니다.

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

 line1 line2 line3

로 변경됩니다.

 line1 |- line2 |- line3

Kiran K Telukunta

나를 위해 일한 대답은 다음과 같습니다. 이 사람에게서:

----인용 vi 편집기를 사용하여 대체에 개행 문자를 삽입하십시오.


해야 할 일이 있고 기억이 나지 않아 찾아봐야 하는 또 다른 일이 있습니다.

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

 :%s/look_for/replace_with^M/g

위의 명령은 "look_for"의 모든 인스턴스를 "replace_with\n"(\n은 개행을 의미함)으로 바꿉니다.

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



user407749

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

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

Evan Donovan

출처 : http:www.stackoverflow.com/questions/71323/how-to-replace-a-character-by-a-newline-in-vim

반응형