안녕하세요 피터입니다.
오늘은 vim에서 특정 문자열을 검색하거나 원하는 문자열로 변경하는 방법을 소개해드리겠습니다.
개요
vim은 다른 텍스트 에디터들이 기본적으로 제공하는 "찾기 및 바꾸기"와 같이 현재 열려 있는 문서 내에서 특정 문자열을 검색하거나 원하는 문자열로 바꿀 수 있습니다.
vim이 강력한 이유는 바로 찾기 및 바꾸기 기능에서 정규 표현식(Regular Expression)을 활용할 수 있기 때문입니다.
문자열 검색하기
화면 하단에 / 문자가 표시되며 커서가 활성화 되면 원하는 검색어를 입력할 수 있습니다.
간단하게 score 라는 검색어를 입력해보겠습니다.
위와 같이 문서 전체에서 score 라는 문자열을 모두 찾아 음영으로 표시해줍니다.
이 때 커서 위치는 현재 커서에서 가장 가까운 검색 결과로 자동으로 이동됩니다.
이 상태에서 n 키를 누르면 다음 검색 결과로 커서가 이동되며, N (shift + n) 키를 누르게 되면 이전 검색 결과로 커서가 이동됩니다.
검색 결과의 마지막에 도달한 경우 n 키를 한번 더 누르면 맨 처음 결과로 되돌아갑니다.
정규표현식으로 검색하기
앞서 말씀드린대로 vim에서의 검색 기능은 정규표현식을 지원하기 때문에 매우 강력합니다.
아래는 정규표현식을 써서 " " 로 감싸여 있는 문자열만 검색하는 예제입니다.
위에서 입력된 정규표현식 ".*" 를 간단하게 설명드리겠습니다.
먼저 특수기호 . (마침표) 와 * (별표: 애스터리스크)는 특별한 의미를 지니는 문자입니다.
. 기호는 모든 문자 1개와 매칭이 됩니다. 즉, 어떤 문자가 와도 상관이 없다는 의미입니다.
* 기호는 바로 앞 문자가 0개 이상 반복된다는 의미입니다. 0개부터 무한대로 반복되죠.
전체를 다 해석해보면 " 로 시작하고 " 로 끝나며 " " 사이에 어떤 문자가 몇 글자가 오던 전부 매칭이 되는 것이죠.
즉, " " 로 감싸여진 모든 문자열과 매칭됩니다.
문자열 바꾸기
vim에서 문자열을 바꾸기 위해서는 명령행 모드에서 치환 명령어를 입력해야 합니다.
문자열을 바꾸는 명령어는 substitute 라는 단어에서 따온 s 이며 아래와 같은 형식으로 구성되어 있습니다.
(시작줄),(끝줄)s/찾을패턴/바꿀문자열/옵션
위와 같이 s 명령어 바로 앞에는 범위를 지정할 수 있는데, 문서 전체에서 바꾸기를 원하는 경우 % 라는 특수 기호를 사용합니다.
아래 예제에서는 : 키를 눌러 명령행 모드로 진입한 뒤 %s/score/num/g 라고 치환 명령어를 입력하여 문자열을 바꿔봤습니다.
위 예제에서는 / (슬래시) 를 구분자(delimeter)로 사용하였지만, 바꾸고자 하는 패턴이나 문자열에 슬래시가 있는 경우 구분자를 @ 또는 | 등으로 변경해서 사용할 수 있습니다.
%s@score@num@g
%s!score!num!g
%s?score?num?g
%s#score#num#g
한 가지 주의하셔야 할 부분은 구분자를 위와 같이 통일시켜야 한다는 것입니다.
일부만 바꿔 쓰는 것은 허용되지 않습니다.
명령어의 가장 뒤에 옵션 부분에는 아래와 같은 옵션을 지정할 수 있습니다.
g: 매칭되는 문자열을 물어보지 않고 변경
i: 대소문자를 구분하지 않고 변경 (ignore cases)
c: 매칭되는 문자열마다 바꿀 것인지 사용자에게 물어보고 변경
옵션은 두가지 이상 한번에 지정할 수 있지만 g 옵션보다 c 옵션이 더 우선됩니다.
찾을 패턴에는 정규 표현식을 사용할 수 있기 때문에 활용도가 매우 높습니다.
패턴을 사용하여 변경하는 경우 패턴이 의도한대로 동작하는지 검색을 통해 확인한 뒤에 바꾸기를 하는 것이 좋습니다.
-Peter의 우아한 프로그래밍
여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.
'프로그래밍 > Vim' 카테고리의 다른 글
[Vim] 대소문자 변경하기 (0) | 2019.10.31 |
---|---|
[Vim] 범위 지정하기 (0) | 2017.04.03 |
[Vim] 이전 명령어 반복 수행 (1) | 2017.03.13 |
[Vim] 복사(Copy), 붙여넣기(Paste), 삭제(Delete), 실행취소(Undo) (1) | 2017.03.06 |
[Vim] 커서 이동 (0) | 2017.02.23 |