C.W.K.
Stream
Lesson 04 of 04 · published

Shell 명령과 global 명령

~14 min · vim, shell, global, advanced-substitute

Level 0갇힌 자
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

Buffer 를 어떤 Unix 도구든 통과시켜

Vim 이 셸과 깊이 통합돼 있어서 많은 텍스트 처리 작업에 plugin 필요 없어 — buffer 를 sort, jq, awk, python, 뭐든지 통과시키고 출력을 다시 읽어와. Vim 이 이미 아는 모든 Unix 도구의 frontend 가 돼.

셸 통합의 세 가지 맛

  • :!cmd — 셸 명령 실행, 출력 표시 (buffer 수정 안 함).
  • :r !cmd — 셸 명령 실행, 출력을 커서 아래 insert.
  • :%!cmd — buffer 전체를 명령에 통과시키고 출력으로 대체. :'<,'>!cmd 가 visual 선택에 같은 일.

킬러 one-liner

:%!sort 가 파일 정렬. :%!sort -u 가 정렬 + 중복 제거. :%!python -m json.tool 이 JSON 포맷. :%!jq . 가 JSON 다시 포맷 + 검증. :%!sed 's/foo/bar/g' 가 sed 파워 유저용. :'<,'>!sort 가 visual 선택만 정렬.

:% 토큰

:%!cmd, :%s/..., :%y% 는 항상 전체 파일. 다른 range 토큰: . = 현재 라인, $ = 마지막 라인, 'a,'b = mark a 부터 mark b, '<,'> = visual 선택.

Global 명령

:g 가 Vim 에서 가장 강력하고 underused 명령 중 하나. 패턴 매치되는 모든 라인에 명령 실행. 안티 형 :v (또는 :g!) 는 매치 안 되는 라인에 실행. :normal 과 합치면 필터된 라인 부분집합에 Normal-mode 액션 적용 가능.

:g 가 find-and-do 명령. :%s 는 find-and-replace. :g 는 find-and-do-anything. :g/pattern/cmd 박히면 팀의 나머지가 수동 grep-and-edit 하는 refactor 기회들이 보여.

고급 substitution 레시피

Capture group 으로 substitution 이 프로그래머블해져. \v (very-magic) 와 합치면 syntax 가 마침내 읽을 만해져. 흔한 레시피:

  • 두 단어 swap: :%s/\v(\w+) (\w+)/\2 \1/g.
  • 매 단어 첫 글자 대문자: :%s/\v(\w+)/\u\1/g.
  • 매치 전체 대문자: :%s/.*/\U&/.
  • 매치 wrap: :%s/\v(\d+)/[\1]/g.

Code

셸 명령 실행·vim
:!ls -la              " ls 실행, 출력 표시
:!python %            " 현재 파일 Python 으로 실행
                      " (% 가 현재 파일명으로 확장)
:r !date              " date 출력 커서 아래 insert
:r !curl -s https://api.github.com/zen   " 어떤 URL 출력이든
:!git diff %          " 현재 파일 diff
외부 도구 통과·vim
:%!sort                       " 파일 전체 정렬
:%!sort -u                    " 정렬 + 중복 제거
:%!python -m json.tool        " JSON pretty-print
:%!jq .                       " JSON 포맷 + 검증
:%!awk '{print NR, $0}'       " 라인 번호 prepend
:'<,'>!sort                  " visual 선택 정렬
:'<,'>!fmt -w 80              " 선택 80 컬럼으로 reflow
Global 명령·vim
:g/pattern/d                  " 매치 모든 라인 삭제
:v/pattern/d                  " 매치 안 되는 모든 라인 삭제
:g/^$/d                       " 모든 빈 라인 삭제
:g/TODO/normal A ;            " 모든 TODO 라인에 ' ;' append
:g/pattern/t$                 " 매치 라인을 파일 끝으로 복사
:g/pattern/m0                 " 매치 라인을 위로 이동
:g/pattern/normal @a          " 매 매치에 매크로 'a' 실행
:g/^def /print                " 'def' 로 시작하는 모든 라인 print
Capture-group substitution·vim
:%s/\v(\w+) (\w+)/\2 \1/g       " 인접 두 단어 swap
:%s/\v(\w+)/\u\1/g               " 매 단어 첫 글자 대문자
:%s/.*/\U&/                          " 매 라인 대문자
:%s/.*/\L&/                          " 매 라인 소문자
:%s/\v(\d+)/[\1]/g                " 매 숫자 [ ] 로 wrap
:%s/\v(\w+)\.(\w+)/\2.\1/g     " 점 주변 부분 swap

External links

Exercise

텍스트 파일 열어. (1) :%!sort 로 파일 전체 정렬, u 로 undo. (2) JSON 파일에 :%!python -m json.tool 통과시켜 포맷. (3) :g/^$/d 로 모든 빈 라인 삭제. (4) :g/TODO/d 로 TODO 포함 모든 라인 삭제. (5) firstname-lastname 페어 리스트에 :%s/\v(\w+) (\w+)/\2 \1/g 로 순서 swap. 매 스텝이 다른 슈퍼파워 같이 느껴져야 해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.