,
현재 파일의 각 줄을 새 줄로 바꾸려고 합니다.
:%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
= \n
및 bar
= \r
.
답변
다음을 사용해야합니다.
:%s/,/^M/g
^M
문자 를 얻으려면 Ctrl+ v와을 차례로 누릅니다 Enter.
답변
\r
여기 당신을 위해 일을 할 수 있습니다.
답변
Windows에서 Vim을 사용하는 경우 Ctrl+ Q대신 Ctrl+를 사용하십시오 V.
답변
이것은 내가 생각하는 방식에 가장 적합한 대답이지만 테이블에서 더 좋을 것입니다.
다시 말하면 :
당신은 사용할 필요가 \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은 파일 형식 설정에 따라 파일에 저장할 때 줄 바꿈 문자를 변환하므로 문제를 혼동 할 수 있습니다.