: g /^$/,/./- j (여러 빈 줄을 단일 공백으로 줄임)는 vim에서 어떻게 작동합니까?


21

Vim 정규 표현식 기사에서 Oleg Raisky는 다음 명령을 사용하여 여러 개의 빈 줄을 하나의 빈 줄로 줄입니다.

:g/^$/,/./-j

누군가 이것이 어떻게 작동하는지 설명해 주시겠습니까?

나는 :g명령과 정규 표현식을 알고 있습니다. 그러나 나는 그 부분 /,/./-j이 무엇인지 이해하지 못했습니다 .

답변:


24

정말 독창적입니다. 그것을 분해하자. ex명령

g/^$/xyzzy

모든 빈 줄을 검색 하고 각 줄에서 xyzzy명령 (임의의 ex명령)을 실행합니다. 참고 xyzzy아닌 실제 ex 명령은, 다음 단락에 따라, 자리 표시 자로 만있다.

여기서 까다로운 점은 xyzzy귀하의 경우 "명령"이 또 다른 검색 명령이라는 것입니다.

,/./-j

,/./-범위를 지정한다. 이것은 형식 <start>,<end>이며 쉼표 앞에 아무것도 없기 때문에 현재 줄 (빈 줄을 찾은 줄)이 시작이라고 가정합니다.

쉼표 뒤에는 /./-다음 문자를 검색한다는 의미 이고 ( .모든 문자를 의미 함) 한 줄을 백업합니다 ( 값이 주어지지 않으면 묵시되므로 /./-짧습니다 /./-1). .빈 패턴이 아닌 첫 번째 줄에서 해당 패턴 을 찾을 수 있습니다.

다시 말해, 범위의 끝은 현재 작동중인 마지막 또는 마지막 빈 줄입니다.

그런 다음 해당 범위에서 조인을 실행합니다.

범위의 시작과 끝이 같으면 (섹션에 하나의 빈 줄만 있음) join은 아무 작업도 수행하지 않습니다. 동일하지 않으면 join이 모두 합류합니다.

이것이 여러 개의 빈 줄을 하나로 결합하는 방법입니다.

예제를 보자 (행 번호는 설명을위한 것일뿐 실제 파일이 아님) :

1 Line 1
2
3 Line 3
4 Line 4
5
6
7
8
9 Line 9

g/^$/명령은 빈 줄을 모두 찾아서 그 작업을 수행합니다 (2, 5, 6, 7 및 8 행).

2 행의 경우 2 ,/./-j에서 2까지의 범위를 설정합니다 (다음 .은 3 행에서 찾은 다음 1을 빼서 2를 얻음). 2,2 범위의 조인은 아무 것도 수행하지 않습니다.

5 행의 경우 5에서 ,/./-j8까지의 범위를 설정합니다 (다음 .9 행에서 찾은 다음 1 빼기). 5,8 범위의 조인은 해당 라인을 모두 합칩니다.

이전 작업의 일부로 사라지는 라인에서는 작업이 수행되지 않습니다. 사이클 초기에 삭제 된 라인을 처리하는 것은 의미가 없기 때문입니다.

즉, 6 행에서 8 행은 삭제되어 (5 행과 결합 됨) 그 이후에는 전역 명령이 작동하지 않습니다.

그것은 vim문서가 2 패스 알고리즘, 하나는 라인을 표시하고 다른 하나는 작업을 수행 한다는 사실을 기반으로합니다 .


2
파일 끝에 빈 줄이 있으면이 명령이 불평합니다.
와일드 카드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.