DaleSchool

검색과 치환

입문15분

학습 목표

  • /와 ?로 검색할 수 있다
  • n, N으로 다음/이전 결과로 이동할 수 있다
  • :%s/old/new/g로 치환할 수 있다
  • *으로 커서 아래 단어를 즉시 검색할 수 있다

동작하는 코드

아래 코드가 Vim에 열려 있다고 생각해 보세요.

const userName = "Alice";
const userAge = 25;
const userEmail = "alice@example.com";

function getUserName() {
  return userName;
}

function getUserAge() {
  return userAge;
}

/user를 입력하고 Enter를 누르면, 파일에서 user가 포함된 첫 번째 위치로 커서가 이동해요. n을 누르면 다음 결과, N을 누르면 이전 결과로 이동해요.

이제 :%s/user/account/g를 입력하고 Enter를 누르면, 파일 전체에서 모든 useraccount로 바뀌어요.

직접 수정하기

위 코드를 Vim에 붙여넣고 직접 해 보세요.

  1. /userName을 입력해서 첫 번째 userName을 찾아보세요.
  2. n을 여러 번 눌러서 모든 userName을 순회해 보세요.
  3. *을 눌러서 커서 아래 단어를 즉시 검색해 보세요. n으로 이동도 가능해요.
  4. :%s/userName/accountName/gc를 입력해서 하나씩 확인하며 바꿔 보세요.
    • y를 누르면 바꾸고, n을 누르면 건너뛰어요.

"왜?"

검색

명령어동작
/패턴아래 방향으로 검색
?패턴위 방향으로 검색
n같은 방향으로 다음 결과
N반대 방향으로 다음 결과
*커서 아래 단어를 아래 방향으로 검색
#커서 아래 단어를 위 방향으로 검색

*은 특히 유용해요. 변수 이름 위에 커서를 놓고 *만 누르면, 그 변수가 어디에서 사용되는지 바로 확인할 수 있어요.

검색 하이라이트

검색 결과를 하이라이트로 표시하면 눈에 잘 들어와요.

:set hlsearch       " 검색 결과 하이라이트 켜기
:nohlsearch         " 현재 하이라이트 끄기 (줄여서 :noh)
:set nohlsearch     " 하이라이트 기능 자체를 끄기

:noh는 현재 하이라이트만 임시로 끄는 거예요. 다음 검색을 하면 다시 하이라이트가 켜져요. 설정 파일에 :set hlsearch를 넣어두면 항상 켜져 있어요.

치환 (substitute)

치환 명령어의 기본 형태는 이래요.

:[범위]s/찾을패턴/바꿀텍스트/[플래그]

범위:

범위의미
(없음)현재 줄만
%파일 전체
1,101번째~10번째 줄
'<,'>비주얼 모드로 선택한 영역

플래그:

플래그의미
g줄에서 모든 일치 항목을 바꿈 (없으면 첫 번째만)
c바꾸기 전에 하나씩 확인
i대소문자 무시

실전 예시

:s/foo/bar/          " 현재 줄의 첫 번째 foo를 bar로
:s/foo/bar/g         " 현재 줄의 모든 foo를 bar로
:%s/foo/bar/g        " 파일 전체의 모든 foo를 bar로
:%s/foo/bar/gc       " 파일 전체에서 하나씩 확인하며 바꾸기
:%s/foo/bar/gi       " 대소문자 무시하고 전체 치환
:5,20s/foo/bar/g     " 5~20번째 줄에서만 치환

확인 모드(c 플래그)에서의 선택지

gc 플래그를 사용하면 매 항목마다 선택할 수 있어요.

동작
y이 항목을 바꿈
n이 항목은 건너뜀
a이 항목과 나머지 전부 바꿈
q치환 중단
l이 항목만 바꾸고 중단

검색과 오퍼레이터 조합

검색 결과를 모션처럼 사용할 수도 있어요.

d/function    → "function"이라는 단어가 나올 때까지 삭제
c/end         → "end"가 나올 때까지 삭제하고 입력 모드 진입

심화 학습

정규식 기초

Vim의 검색은 정규식을 지원해요. 자주 쓰는 패턴을 알아두면 편리해요.

/\d\+           " 숫자 하나 이상
/\<word\>       " 정확히 'word'만 (부분 일치 제외)
/^const         " 줄 시작이 const인 경우
/;$             " 줄 끝이 ;인 경우

*로 검색할 때는 자동으로 \<word\> 형태로 검색돼서 정확한 단어만 찾아요.

변수 이름 리팩토링

아래 코드에서 dataresponse로 이름을 바꿔 보세요.

function fetchData() {
  const data = fetch("/api/users");
  const dataList = data.json();
  console.log("data loaded:", dataList);
  return data;
}

1단계: *data를 검색해서 몇 군데에서 쓰이는지 확인하세요. 2단계: :%s/data/response/gc로 하나씩 확인하며 바꿔 보세요.

주의: dataListdata도 바뀌나요? "data loaded:"data는요? gc 플래그로 선택적으로 바꿀 수 있어요.

도전: :%s/\<data\>/response/gc로 정확한 단어 매칭을 시도해 보세요.

question: ":%s/old/new/g에서 %는 무엇을 의미하나요?" options:

question: "커서 아래의 단어를 즉시 검색하는 키는?" options:

question: ":%s/foo/bar/gc에서 c 플래그의 역할은?" options: