콘텐츠로 건너뛰기
Home » :global 명령

:global 명령

:global 혹은 :g 명령은 Ex 명령인 [cmd]를 전체 혹은 지정한 range 사이의 모든 라인에 중에서 패턴이 일치하는 라인에 대해 실행한다. 의외로 놓치고 활용을 많이 안하는 명령인데, 반복적인 편집 뿐만 아니라 조금만 연습하면 강력한 편집 기능을 구현할 수 있다. 또한 일상적으로는 잘 쓰이지 않는 일부 명령들을 조합하여 유용하게 사용하게 되기 때문에 편집 명령에 대해서도 공부할 수 있는 좋은 출발점이 된다.

:global 명령의 형식은 다음과 같다.

:[range]g[lobal]/{pattern}/[cmd]

사용예제

특정한 패턴에 매치하는 모든 라인을 삭제하는데, :global 명령이 적격이다. 라인을 지우는 명령은 d 이므로 :g/pattern/d 와 같은 명령을 사용할 수 있다. 반대로 패턴에 일치하지 않는 라인을 모두 삭제하려면 :g!/pattern/d:v/pattern/d 명령을 사용한다.

만약 빈 줄을 모두 지우고 싶다면 다음 패턴을 사용한 명령을 적용한다.

:g/^\s*$/d

:g 명령을 사용하면 일반적으로 잘 쓸 일이 없던 편집 명령을 종종 사용하게 되거나, 좀 더 자세히 살펴볼 기회도 된다고 했다. 노멀모드에서 y 키는 yank, 즉 복사의 기능인데 사실 :y 라는 Ex 명령도 존재한다. 동일하게 현재 라인을 복사하는 명령이며, 레지스터명을 인자로 받을 수 있다.

:y 명령을 사용해서 특정한 단어가 들어가는 모든 라인을 하나의 레지스터에 모을 수 있다. 레지스터 이름을 대문자로 쓰면 해당 레지스터를 덮어쓰지 않고, 내용을 연결해서 쓰기 때문이다.

:g/function/y A

혹은 특정한 라인들을 파일의 한쪽으로 이동하거나 복사해서 모아 둘 수 있다. :copy, :move 가 라인을 이동시킬 때 사용하는 명령인데, 그 약어로 :t, :m 이 있다. 이를 활용하면 특정 단어가 들어간 라인만 파일끝에 모아보거나, 파일의 각 라인을 역순으로 재배치할 수 있다.

" 'function'이 들어간 라인을 파일 끝에 복사한다.
:g/function/t$

" m0 을 사용하면 현재 라인을 맨 위로 이동한다.
" 전체라인에 대해 순차적으로 적용하면 모든 줄을 역으로 뒤집을 수 있다.
:g/^/m0

:global 명령에서는 어떤 EX 명령이든 다 사용할 수 있기에, :normal 명령을 사용하면 노멀모드에서 특정 패턴을 찾아다니면서 똑같은 동작을 반복하는 것도, 매크로보다 더 편하게 한큐에 해결할 수 있다.

:g/^\d/exec "normal! \<C-A>"

다음 두 명령은 같은 동작을 하는데, ‘DEBUG’라는 단어가 있는 모든 라인을 주석처리한다.

" normal 명령으로
:g/^\s*DEBUG/exec "norm! I/* \<Esc>A */\<Esc>

" 같은 동작을 :s 명령으로
:g/^\s*DEBUG/s!.*!/* & */! 
" & 는 전체 매치 패턴을 말한다. (no magic)
" magic 모드에서는 \& 를 사용할 것.

특정 단어로 시작하는 줄 맨 뒤에 원하는 단어를 붙여주기

:g/^function/s#$# abort

참고

그외에 참고할만한 편집 명령 관련 팁이다.

:2,8copy15  " 2~8번째 줄을 15번 라인뒤에 복사한다.
:4,15t$   " 4~15번째 줄을 맨 뒤로 복사한다. (t: == :copy)
:-t$      " 바로 앞줄을 맨 뒤로 복사한다.
:m0       " 현재 줄을 맨 위로 이동한다.
:.,+3m$-1 " 현재줄부터 3줄을 맨 윗줄의 위로 이동한다.