본문 바로가기
C.W.K.
Stream
Lesson 04 of 06 · published

검색과 치환

~13 min · vim, search, substitute, regex

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

검색도 motion이야

/pattern으로 다음 걸 찾는 건 이미 알지. 진짜 마법은 검색이 operator와 붙는다는 데 있어. d/foo<Enter>는 커서부터 다음 "foo"까지를 통째로 지워. 검색은 따로 노는 도구가 아니라 동사 체인에 들어가는 재료야.

기본 검색 키

  • /pattern — regex로 앞쪽 검색.
  • ?pattern — 뒤쪽 검색.
  • n — 다음 매치 (마지막 검색과 같은 방향).
  • N — 반대 방향 매치.
  • * — 커서 위 단어를 앞쪽으로 검색.
  • # — 커서 위 단어를 뒤쪽으로 검색.
  • :noh — 검색 하이라이트 끄기 (트랙 4에서 <Esc>에 매핑할 거야).

Substitute 명령

Vim의 :s가 regex 검색-치환이고, 알아둬야 할 flag가 몇 개 있어.

  • g — 줄 안에서 전부 (첫 번째만 바꾸고 멈추지 않아).
  • c — 하나씩 확인받기 (위험한 변경엔 이걸 붙여).
  • i — 대소문자 무시.
  • I — 대소문자 구분 (ignorecase 설정을 무시해).

범위가 중요해

:s/a/b/는 지금 줄만 바꿔. :%s/a/b/g에서 %는 "파일 전체"고. :'<,'>s/a/b/g는 Visual로 고른 범위, :5,20s/a/b/g는 5번부터 20번 줄이야. 범위가 먼저, 명령이 나중 — 이 순서만 기억하면 돼.

magic, very magic, 그리고 백슬래시 지옥

Vim의 regex에 기호가 유난히 많아 보이는 건, 기본 상태로는 메타문자마다 백슬래시를 붙여야 해서야. 패턴 맨 앞에 \v를 붙이면 "very magic" 모드가 켜지면서 다른 데서 쓰던 regex랑 똑같아져. (, +, ?가 백슬래시 없이 먹히거든. 조금이라도 복잡한 regex는 무조건 \v로 시작하는 습관을 들여.

마지막 치환 다시 걸기. Normal mode에서 &를 누르면 지금 줄에 마지막 :s를 다시 걸어. g&는 파일 전체에 다시 걸고. dot 명령이랑 같은 발상이야 — 검색·치환도 자기만의 반복 키를 갖고 있는 거지.

Code

검색 기본·vim
/pattern<Enter>    " 앞으로 검색
?pattern<Enter>    " 뒤로 검색
n                  " 다음 매치 (같은 방향)
N                  " 다음 매치 (반대 방향)
*                  " 커서 위 단어 앞으로 검색
#                  " 커서 위 단어 뒤로 검색
:noh               " 검색 하이라이트 클리어
:set hlsearch ic   " 검색 하이라이트 + case 무시 (둘 다 원함)
Substitute — 정통 패턴·vim
:s/old/new/         " 이 라인의 첫 매치 치환
:s/old/new/g        " 이 라인의 모든 매치
:%s/old/new/g       " 파일의 모든 매치
:%s/old/new/gc      " confirm 와 함께 (y/n/a/q)
:'<,'>s/old/new/g   " visual 선택의 모든 매치
:5,20s/old/new/g    " 5-20 라인의 모든 매치
:g/TODO/d           " TODO 포함하는 모든 라인 삭제
Very-magic regex — 백슬래시 수프 해결·vim
:%s/\v(\w+) (\w+)/\2 \1/g    " 인접한 두 단어 swap
:%s/\v\s+$//                       " 후행 whitespace 제거
:%s/\v^\s+//                       " 선행 whitespace 제거
:%s/\v(foo|bar|baz)/X/g            " escape 없이 alternation
:%s/\v(\d+)\.(\d+)/\2.\1/g    " 점 주변 부분 swap

External links

Exercise

소스 파일을 열고, 확인 프롬프트가 어떤 느낌인지 알 수 있게 셋 다 gc를 붙여서 해봐. (1) 변수 하나를 파일 전체에서 이름 바꾸기, (2) :%s/\v\s+$//로 줄 끝 공백 전부 지우기, (3) 작은 블록의 각 줄에서 단어 두 개의 순서를 very-magic 캡처 그룹으로 뒤집기. regex가 이상하다 싶으면 되돌리고 천천히 다시 읽어 — 캡처 그룹이 처음엔 다들 틀리는 지점이야.

Progress

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

댓글 0

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

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