답변:
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
). 그것을 가지고 있지 않습니다.
:%s/$/
한 다음을 누른 ^V
다음을 누르십시오 Enter
.
:%s/$/<C-V><CR><CR>
일반적인 vim-folk 인코딩을 사용 한다고 가정하면 각 행 뒤에 줄 바꿈을 추가하면됩니다. 즉, 이미 공백으로 구분 된 행 (예제 텍스트에서 3 행-> 4 행 참조)에 빈 행이 추가로 줄어 듭니다. 원래 질문은 시작 텍스트에 이미 존재하는 빈 줄을 추가하지 않는 것이 었습니다.
@NeilForester의 전역 검색 및 바꾸기 답변을 테스트했을 때 줄에 하나의 문자 만 있으면 빈 줄이 아닌 줄에서 두 번째 의도 된 교체를 놓친 것으로 나타났습니다. 이것은 이전 경우와 일치하는 마지막 문자 다음 에 각 경우에 패턴이 일치하기 시작한 것으로 보입니다 .
lookbehind와 lookahead를 사용하면이 문제가 해결되고 정규 표현식도 약간 짧아집니다.
:%s/\n\@<!\n\n\@!/\r\r/g
\n\@<!\n
다른 줄 바꿈 직후에 올바르지 않은 줄 바꿈 이 정확하다는 것을 의미합니까? 그러나 나는 무슨 \n\@!
뜻 인지 이해할 수 없었다 . 나는 그것을 배우고 다른 검색 패턴에 적용 할 수 있도록 이해하고 싶습니다 :)
\n\@<!\n
즉시 다른 줄 바꿈을 따르지 않는 줄 바꿈을 의미합니다. \n\@!
선행 원자 (즉 \n
)가 뒤에 오는 것 직전에 일치하지 않으면 너비가 0과 일치 합니다. :help \@<!
vim에서 이것에 대한 문서를 보십시오 . I
/[^\n]\n[^\n]
:map <F2> no<esc><F2>
그런 다음를 누릅니다 <F2>
. 공백이 아닌 연속 된 두 줄을 검색 한 다음 그 사이에 한 줄을 반복해서 추가합니다.
편집하다:
단일 글로벌 검색 및 바꾸기로 수행 할 수있는 대체 방법은 다음과 같습니다.
:%s/\([^\n]\)\n\([^\n]\)/\1\r\r\2/g
이 명령을 시도하십시오 ( 16
문자) :
:%!sed G|cat -s
:%norm o
있지만의 경우 의도 한대로 작동하지 않는 것으로 판명되었습니다o
. +1