프로그래밍/Vim

[Vim] 문자열 검색 및 바꾸기

Peter Ahn 2019. 10. 29. 18:17
반응형

 

안녕하세요 피터입니다.

오늘은 vim에서 특정 문자열을 검색하거나 원하는 문자열로 변경하는 방법을 소개해드리겠습니다.

 

개요

vim은 다른 텍스트 에디터들이 기본적으로 제공하는 "찾기 및 바꾸기"와 같이 현재 열려 있는 문서 내에서 특정 문자열을 검색하거나 원하는 문자열로 바꿀 수 있습니다. 

vim이 강력한 이유는 바로 찾기 및 바꾸기 기능에서 정규 표현식(Regular Expression)을 활용할 수 있기 때문입니다. 

 

 

문자열 검색하기

vim에서 특정 문자열을 검색하기 위해서는 일반모드에서 슬래시( / ) 키를 이용하여 검색 대화창을 띄워야 합니다.
 
/ 키를 눌러 검색 입력 활성화 후 score 검색어 입력

화면 하단에 / 문자가 표시되며 커서가 활성화 되면 원하는 검색어를 입력할 수 있습니다. 

간단하게 score 라는 검색어를 입력해보겠습니다. 

 

 

위와 같이 문서 전체에서 score 라는 문자열을 모두 찾아 음영으로 표시해줍니다. 

이 때 커서 위치는 현재 커서에서 가장 가까운 검색 결과로 자동으로 이동됩니다. 

이 상태에서 n 키를 누르면 다음 검색 결과로 커서가 이동되며, N (shift + n) 키를 누르게 되면 이전 검색 결과로 커서가 이동됩니다. 

 

마지막 검색 결과에서 n 키를 누르면 맨 처음 검색 결과로 이동

 

검색 결과의 마지막에 도달한 경우 n 키를 한번 더 누르면 맨 처음 결과로 되돌아갑니다.  

 

정규표현식으로 검색하기

앞서 말씀드린대로 vim에서의 검색 기능은 정규표현식을 지원하기 때문에 매우 강력합니다. 

아래는 정규표현식을 써서 " " 로 감싸여 있는 문자열만 검색하는 예제입니다.

 

정규표현식으로 검색

 

위에서 입력된 정규표현식 ".*" 를 간단하게 설명드리겠습니다.

먼저 특수기호 . (마침표)* (별표: 애스터리스크)는 특별한 의미를 지니는 문자입니다. 

.  기호모든 문자 1개와 매칭이 됩니다. 즉, 어떤 문자가 와도 상관이 없다는 의미입니다. 

*  기호바로 앞 문자0개 이상 반복된다는 의미입니다. 0개부터 무한대로 반복되죠.

전체를 다 해석해보면 " 로 시작하고 " 로 끝나며 " " 사이에 어떤 문자가 몇 글자가 오던 전부 매칭이 되는 것이죠.

즉, " " 로 감싸여진 모든 문자열과 매칭됩니다. 

 

문자열 바꾸기

vim에서 문자열을 바꾸기 위해서는 명령행 모드에서 치환 명령어를 입력해야 합니다. 

문자열을 바꾸는 명령어는 substitute 라는 단어에서 따온 s 이며 아래와 같은 형식으로 구성되어 있습니다.  

(시작줄),(끝줄)s/찾을패턴/바꿀문자열/옵션

위와 같이 s 명령어 바로 앞에는 범위를 지정할 수 있는데, 문서 전체에서 바꾸기를 원하는 경우 % 라는 특수 기호를 사용합니다. 

 

아래 예제에서는 : 키를 눌러 명령행 모드로 진입한 뒤 %s/score/num/g 라고 치환 명령어를 입력하여 문자열을 바꿔봤습니다. 

score 를 num 으로 변경하는 예제. 변경이 적용된 라인 수를 알 수 있다

 

위 예제에서는 / (슬래시) 를 구분자(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의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.

반응형