다음 명령이 작동해야한다고 생각합니다.
:%s/^\(.*\)\(\n\1\)\+$/\1/
설명 :
전체 파일에서 치환 명령을 사용하여 다음과 같이 변경 pattern
합니다 string
.
:%s/pattern/string/
여기에 pattern
있습니다 ^\(.*\)\(\n\1\)\+$
및 string
입니다 \1
.
pattern
다음과 같이 분류 할 수 있습니다.
^\(subpattern1\)\(subpattern2\)\+$
^
그리고 $
각각 라인의 시작과 라인의 끝과 일치.
\(
및 \)
둘러싸는 데 사용되는 subpattern1
우리가 특별한 번호로 나중에 참조 할 수 있도록 \1
.
그것들은 또한 subpattern2
우리가 수량 화기로 1 회 이상 반복 할 수 있도록 둘러싸는 데 사용됩니다 \+
.
subpattern1
은 .*
.
개행을 제외한 모든 문자와 일치하는 메타 문자이며 *
마지막 문자 0, 1 회 이상 일치하는 수량 자입니다.
따라서 .*
줄 바꿈이없는 텍스트와 일치합니다.
subpattern2
되고 \n\1
\n
새로운 라인과 일치 \1
먼저 내부 유사한 것과 같은 텍스트와 일치하는 \(
, \)
여기를한다 subpattern1
.
따라서 다음 pattern
과 같이 읽을 수 있습니다.
줄의 시작 ( ^
), 새 줄이없는 텍스트 ( ), .*
새 줄 ( \n
), 같은 텍스트 ( \1
), 뒤의 두 개가 한 번 이상 반복됩니다 ( \+
) 마지막으로 줄의 끝 ( $
) .
pattern
일치하는 곳 (동일한 줄의 블록)이면 대체 명령 string
이 여기있는 곳 \1
(블록의 첫 번째 줄)으로 바꿉니다 .
파일에서 아무것도 변경하지 않고 어떤 행 블록이 영향을 받는지 확인하려면 hlsearch
옵션을 활성화 n
하고 명령 끝에 대체 플래그를 추가 할 수 있습니다 .
:%s/^\(.*\)\(\n\1\)\+$/\1/n
보다 세밀한 제어를 위해 c
대체 플래그를 대신 추가하여 각 라인 블록을 변경하기 전에 확인을 요청할 수도 있습니다 .
:%s/^\(.*\)\(\n\1\)\+$/\1/c
대체 명령 읽기에 대한 자세한 내용은 :help :s
,
대체 플래그 :help s_flags
,
다양한 메타 문자 및 한정사가 읽기 :help pattern-atoms
,
및 위해 정력에 정규 표현식 읽기 이 .
편집 : 와일드 카드$
끝에 에를 추가하여 명령의 문제를 해결했습니다 pattern
.
또한 BloodGain 은 더 짧고 읽기 쉬운 동일한 명령 버전을 가지고 있습니다.
$
그래도 당신의 명령이 필요합니다 . 그렇지 않으면 이전 줄과 동일한 텍스트로 시작 하지만 다른 후행 문자가 있는 줄로 예기치 않은 작업을 수행 합니다. 또한 당신이 준 기본 명령은 기능적으로 내 대답과 동일:%!uniq
하지만 강조 표시 및 확인 플래그는 좋습니다.