Vim-줄 사이에 빈 줄 추가


15

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

예. ...에서

line 1
line 2
line 3

line 4
line 5

line 1

line 2

line 3

line 4

line 5

답변:


27

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). 그것을 가지고 있지 않습니다.


1
정확하게. 나는 일반적으로 약식을 찾고 :%norm o있지만의 경우 의도 한대로 작동하지 않는 것으로 판명되었습니다 o. +1
sehe

을 입력 :%s/$/한 다음을 누른 ^V다음을 누르십시오 Enter.
jpaugh

1
@jpaugh 키 프레스의 :%s/$/<C-V><CR><CR>일반적인 vim-folk 인코딩을 사용 한다고 가정하면 각 행 뒤에 줄 바꿈을 추가하면됩니다. 즉, 이미 공백으로 구분 된 행 (예제 텍스트에서 3 행-> 4 행 참조)에 빈 행이 추가로 줄어 듭니다. 원래 질문은 시작 텍스트에 이미 존재하는 빈 줄을 추가하지 않는 것이 었습니다.
트레버 파월

3

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

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

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

감사! 이것은 작동하며 검색을 다시 실행하면 더 많은 줄을 추가하지 않습니다 (예 : 파일에 새 줄을 추가했습니다).

1
검색 패턴의 각 정규 표현식이 무엇을 의미하는지 설명해 주시겠습니까? vim 도움말을 보면 \n\@<!\n다른 줄 바꿈 직후에 올바르지 않은 줄 바꿈 이 정확하다는 것을 의미합니까? 그러나 나는 무슨 \n\@!뜻 인지 이해할 수 없었다 . 나는 그것을 배우고 다른 검색 패턴에 적용 할 수 있도록 이해하고 싶습니다 :)

예, \n\@<!\n즉시 다른 줄 바꿈을 따르지 않는 줄 바꿈을 의미합니다. \n\@!선행 원자 (즉 \n)가 뒤에 오는 것 직전에 일치하지 않으면 너비가 0과 일치 합니다. :help \@<!vim에서 이것에 대한 문서를 보십시오 . I
Simon

3

또 다른 방법:

%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입니다.


0

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


k줄을 위로 이동합니다. j한 줄 아래로 이동합니다.
닐 포레스터

그렇습니다. 내 실수. 고마워 닐!

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

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

편집하다:

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

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

내 파일에는 많은 줄이 있습니다. 전체 파일에 대해 정규식 검색 및 삽입 빈 줄을 수행하는 방법이 있습니까? stackoverflow.com/questions/2673209/…를 보고 있었지만 모든 정규식 명령의 의미를 파악할 수 없었습니다.

재귀 매핑없이 단일 명령으로 동일한 작업을 수행하는 다른 방법은 위의 편집을 참조하십시오. 첫 번째 방법은 전체 파일에서 작동해야합니다.
닐 포레스터

0

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

:%!sed G|cat -s

짧은 명령을 "vimgolf"로 시도하는 대신 사용되는 다소 모호한 옵션에 대한 약간의 설명이 더 도움이 될 것입니다.
Ingo Karkat

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.