빈 줄이 아닌 모든 줄 사이에 빈 줄을 어떻게 삽입합니까?
예. …에서
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
명령 모드에서 입력하는 것 입니다. 그리고 다음 줄에서 .
. 간단한 매크로로로드 할 수 있습니다.