Vim-줄 사이에 빈 줄 추가 어떻게 삽입합니까? 예. …에서 line 1 line 2 line 3 line

빈 줄이 아닌 모든 줄 사이에 빈 줄을 어떻게 삽입합니까?

예. …에서

line 1
line 2
line 3

line 4
line 5

line 1

line 2

line 3

line 4

line 5


답변

Vim의 : g 명령은 정확히 이런 종류의 작업을 위해 설계되었습니다. 특정 패턴과 일치하는 모든 라인에서 단일 조치를 실행합니다. 내 대답은 다음과 같습니다.

:g/.\n\n\@!/norm o

내가 사용하는 패턴은 /.\n\n\@!/입니다. 구성 요소 조각으로 분류 :

  • .줄의 모든 문자와 일치합니다. (기존의 빈 줄을 고려하지 않고 즉시 버리는 데 사용됨)
  • \n 위의 문자 끝에서 단일 \ n과 일치
  • \n\@! 이전 \ n 바로 다음에 또 다른 \ n이 있으면 일치하지 않습니다.

( 정규 표현식에서 유사한 일치 지정자에 :h E59대한 자세한 정보를 확인하십시오. \@!다른 항목도 있습니다!)

따라서 : g 명령의 정규 표현식은 비어 있지 않은 모든 행을 선택했습니다.이 행은 하나의 줄 바꿈으로 끝나고 그 뒤에 빈 줄이 없습니다.

:g명령문 의 패턴 다음에 일치하는 행에서 실행하라는 명령이옵니다. 이 경우, 나는 일반 모드 명령 (으로 약칭 norm) 을 실행하도록 지시했으며 실행 명령은 간단 o합니다. 현재 행 아래에 빈 줄이 삽입됩니다.

따라서이 명령은 빈 줄이없는 모든 줄을 찾아서 추가합니다. 그리고 그것이 전부입니다! vim Wiki의 Power of G 기사에서 더 멋진 일을 할 수 있는지 확인하고 싶을 수도 있습니다 :g(그리고 부정적인 자매입니다 :v). 그것을 가지고 있지 않습니다.


답변

@NeilForester의 전역 검색 및 바꾸기 답변을 테스트했을 때 줄에 하나의 문자 만 있으면 빈 줄이 아닌 줄에서 두 번째 의도 된 교체를 놓친 것으로 나타났습니다. 이것은 이전 경우와 일치하는 마지막 문자 다음 에 각 경우에 패턴이 일치하기 시작한 것으로 보입니다 .

lookbehind와 lookahead를 사용하면이 문제가 해결되고 정규 표현식도 약간 짧아집니다.

:%s/\n\@<!\n\n\@!/\r\r/g

답변

또 다른 방법:

%s/\(.\)\n\(.\)/\1\r\r\2/

어떤 의미

\(.\) match and capture a non-newline character,
\n    match a newline
\(.\) match and capture a non-newline character

첫 번째 캡처, 두 줄 바꿈 및 두 번째 캡처로 대체하십시오.

예를 들어 line1\nLine2결과는 \1 = 1\2 = L입니다.


답변

내가 틀렸다면 나를 바로 잡으십시오. 명령 모드에서 줄 아래로 이동하면 문자 k를 사용한다고 생각합니다. 그런 다음 삽입 모드로 들어가서 다음 줄을 추가하십시오. 필요에 따라 반복 하시겠습니까? 도움이 되었기를 바랍니다!


답변

/[^\n]\n[^\n]
:map <F2> no<esc><F2>

그런 다음를 누릅니다 <F2>. 공백이 아닌 연속 된 두 줄을 검색 한 다음 그 사이에 한 줄을 반복해서 추가합니다.

편집하다:

단일 글로벌 검색 및 바꾸기로 수행 할 수있는 대체 방법은 다음과 같습니다.

:%s/\([^\n]\)\n\([^\n]\)/\1\r\r\2/g

답변

이 명령을 시도하십시오 ( 16문자) :

:%!sed G|cat -s

답변

파일의 길이는 모르지만 가장 간단한 방법 중 하나는 o명령 모드에서 입력하는 것 입니다. 그리고 다음 줄에서 .. 간단한 매크로로로드 할 수 있습니다.