Vim 정규 표현식 기사에서 Oleg Raisky는 다음 명령을 사용하여 여러 개의 빈 줄을 하나의 빈 줄로 줄입니다.
:g/^$/,/./-j
누군가 이것이 어떻게 작동하는지 설명해 주시겠습니까?
나는 :g
명령과 정규 표현식을 알고 있습니다. 그러나 나는 그 부분 /,/./-j
이 무엇인지 이해하지 못했습니다 .
Vim 정규 표현식 기사에서 Oleg Raisky는 다음 명령을 사용하여 여러 개의 빈 줄을 하나의 빈 줄로 줄입니다.
:g/^$/,/./-j
누군가 이것이 어떻게 작동하는지 설명해 주시겠습니까?
나는 :g
명령과 정규 표현식을 알고 있습니다. 그러나 나는 그 부분 /,/./-j
이 무엇인지 이해하지 못했습니다 .
답변:
정말 독창적입니다. 그것을 분해하자. 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에서 ,/./-j
8까지의 범위를 설정합니다 (다음 .
9 행에서 찾은 다음 1 빼기). 5,8 범위의 조인은 해당 라인을 모두 합칩니다.
이전 작업의 일부로 사라지는 라인에서는 작업이 수행되지 않습니다. 사이클 초기에 삭제 된 라인을 처리하는 것은 의미가 없기 때문입니다.
즉, 6 행에서 8 행은 삭제되어 (5 행과 결합 됨) 그 이후에는 전역 명령이 작동하지 않습니다.
그것은 vim
문서가 2 패스 알고리즘, 하나는 라인을 표시하고 다른 하나는 작업을 수행 한다는 사실을 기반으로합니다 .