내가 Vim에서 대량 텍스트 변경을 처리하는 방법

발행: (2026년 2월 24일 오후 05:35 GMT+9)
8 분 소요
원문: Dev.to

Source: Dev.to

(번역할 텍스트가 제공되지 않았습니다. 번역을 원하시는 본문을 알려주시면 한국어로 번역해 드리겠습니다.)

Source:

외부 명령어(!)로 텍스트 파이프하기

Vim의 ! 연산자는 텍스트를 셸 명령으로 전달하고, 그 명령의 출력으로 교체합니다.

  • :%!{cmd} – 전체 버퍼에 대해 명령을 실행합니다.
  • :5,20!{cmd} – 5‑20줄에만 실행합니다.
  • 비주얼 선택 후 !를 사용하면 자동으로 범위 :'가 적용됩니다.

명령이 비정상 종료하거나 출력이 없을 경우 Vim은 원래 버퍼를 복원하므로 안전하게 실험할 수 있습니다. 명령이 중간에 충돌하면 여전히 u(undo)로 되돌려야 합니다.

예시

:%!jq .

터미널에서 복사한 한 줄짜리 JSON 응답을 포맷합니다.

:%!sort -u

목록에서 중복을 제거합니다.

:%!column -t

값들의 표를 정렬합니다.

:5,20!indent

5‑20줄만 포맷합니다.

치환에서 대소문자 변환 원자

Vim의 교체 문자열은 대소문자 변환 원자를 지원합니다:

원자효과
\U뒤에 오는 모든 문자를 대문자로 변환
\L뒤에 오는 모든 문자를 소문자로 변환
\u다음 문자만 대문자로 변환
\l다음 문자만 소문자로 변환
\E이전 \U/\L 변환을 종료

캡처 그룹과 결합하면, 이 원자들을 사용해 외부 스크립트 없이 식별자를 정규화할 수 있습니다.

예시

:%s/\v/\u\L\1/g

각 단어의 첫 글자를 대문자로, 나머지는 소문자로 변환합니다.

:%s/\v(\w+)/\U\1/g

모든 환경 변수 이름을 대문자로 변환합니다 (예: SCREAMING_SNAKE, screaming_snake).

:%s/_\(\w\)/\u\1/g

snake_case를 각 언더스코어 뒤의 문자를 대문자로 바꿔 SnakeCase로 변환합니다.

:%s/\U\1\E-\2/\U\1-\2/g

첫 번째 캡처 그룹만 대문자로 변환하고 두 번째는 그대로 둡니다.

인터랙티브 검색 네비게이션 (incsearch)

incsearch(Vim 8+ 및 Neovim에서 기본적으로 활성화됨)와 함께 를 사용하면 검색 프롬프트에 머물면서 앞으로와 뒤로 매치를 이동할 수 있어, 커밋하기 전에 정확한 위치를 미리 볼 수 있습니다.

사용 방법

  1. 일반 모드에서 /pattern 을 입력합니다.
  2. 를 눌러 다음 매치로 이동하고, 다시 를 눌러 그 다음 매치로 이동합니다.
  3. “ 를 눌러 뒤로 이동합니다.
  4. 원하는 매치가 강조 표시되면 “ 를 눌러 선택합니다.

예시: 파일에서 user 의 세 번째 발생 위치로 이동하려면:

/user

이렇게 하면 특히 큰 파일에서 눈에 보이지 않는 n/N 탐색을 피할 수 있습니다. incsearch가 설정되어 있을 때만 작동합니다 (:set incsearch).

전역 명령(:g)으로 구조화된 블록 삭제하기

:g(global) 명령은 범위에 대해 작동할 수 있어, 생성된 HTML 스캐폴딩이나 로그 섹션과 같이 표시된 블록을 제거하는 데 이상적입니다.

구문

:g/{start_pattern}/,/{end_pattern}/{cmd}

예시

:g//,//d

HTML 주석 사이의 모든 블록을 삭제합니다.

:g/DEBUG START/,/DEBUG END/d

크래시 로그에서 모든 디버그 덤프를 제거합니다.

삭제 전 미리 보기

:g//,//p

삭제될 줄을 출력하여 범위를 확인할 수 있습니다.

참고: :g는 매치를 위에서 아래로 처리하면서 진행 중에 줄 번호를 업데이트하므로 연속된 블록이 올바르게 처리됩니다. 종료 마커가 시작 마커보다 먼저 나타나면 범위가 의도치 않게 확장될 수 있으니, 항상 p를 사용해 미리 확인하세요.

Refactoring Across a Project with Quickfix (:cdo)

:cdo 명령은 quickfix 리스트의 각 항목에 대해 지정된 Ex 명령을 실행하여 개별 발생에 대한 정밀 제어를 제공합니다. 이는 :vimgrep(또는 유사 명령)으로 quickfix 리스트를 채운 뒤, 코드베이스 전체에서 특정 패턴의 모든 인스턴스를 찾을 때 유용합니다.

Workflow

  1. quickfix 채우기:

    :vimgrep /deprecatedCall/ **/*.go
  2. 모든 매치에 대해 치환을 적용하고 파일 저장:

    :cdo s/deprecatedCall/replacementCall/ | update
    • | update 은 치환 후 파일을 기록합니다.
    • 정규식만으로는 충분하지 않을 때는 :cdo norm @q 를 사용해 각 위치에서 기록된 매크로를 재생할 수 있습니다.

Alternatives

  • :cfdo 는 파일당 한 번씩 명령을 실행합니다(파일 전체에 걸친 변경에 유용).
  • :cdo 는 동일한 라인이 여러 검색 결과에 나타날 경우 중복 항목을 포함합니다.

:cdo 는 파일을 자동으로 저장하지 않으므로 항상 | update(또는 | w) 를 추가해야 하며, 변경 사항을 먼저 검토하고 싶다면 이를 생략할 수 있습니다.

Closing Thoughts

이 다섯 가지 Vim 명령—외부 파이핑, 대소문자 변환 치환, 인터랙티브 검색 탐색, 전역 블록 삭제, 그리고 quickfix‑기반 리팩터링—은 플러그인 없이도 다양한 대량 편집 시나리오를 포괄합니다. Vim과 Neovim 모두에서 동일하게 작동합니다.

더 실용적인 Vim 트릭을 보려면 방문하세요 .

Vim에서 아직도 느리게 느껴지는 대량 편집 작업은 무엇인가요?

0 조회
Back to Blog

관련 글

더 보기 »

FSCSS 변수 대체 연산자 (||)

FSCSS Variable Fallback Operator의 커버 이미지 ||https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fd...

Fedora / Red Hat에 Kiro 설치

개요 이 가이드가 수행하는 작업 - 공식 다운로드 서버에서 Kiro IDE 데스크톱 앱을 설치합니다. - 데스크톱 엔트리를 설정하여 Kiro를 실행할 수 있도록 합니다…