문자열 치환기(vim)
(부제: 검색과 변경, Search and Replace)
- Vim Tips Wiki - Search and Replace 글을 참조하였으며, 좀 더 쉬운 이해를 위해 의역 및 내용을 변경하였습니다.
- substitute 명령에 관한 좀 더 자세한 내용을 참조하려면 vim의 도움말 기능을 참고 하세요.
(:help substitute )
:substitute
문자열 치환(:substitute) 명령은 특정한 글의 패턴을 다른 문자열로 대체 하는데 사용된다. 이 명령의 골격 형태는 아래와 같다.
:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
특히 자주 사용되는 예를 살펴 보자.
:s/foo/bar/g
글 내부에 존재하는 모든 'foo'를 'bar'로 바꾼다.
:s/foo/bar/gc
위의 명령과 같지만 확인과정(confirmation)을 거친다.
:s/\<foo\>/bar/gc
위와 같으며, 단일한 단어 foo만 bar로 바꾼다.(단어 사이에 존재하는 foo를 제외 예/ foolish, afoo 등등)
:s/foo/bar/gci
위와 같으며, 대소문자를 구분하지 않는다.(case insensitive)>
:s/foo/bar/gcl
위와 다르게 대소문자를 구분한다.(case sensitive)
위의 예제들을 살펴보면, 총 4가지 플래그들이 나왔다. 플래그 'g'의 의미는 전역(global)의 의미이므로 문장 전체를 검색한다. 그리고 나머지 c,i,l은 위의 예제로도 충분하리라 생각이 된다.
검색의범위(Search Range)
:5,12s/foo/bar/g
5번째 줄에서 12번째 줄사이에 존재하는 foo를 bar로 바꾸겠다는 것이다.
:'a,'bs/foo/bar/g
위와 같으며, a와 b 마크 사이로 대체 검색범위을 한정시킨다.
:.,$s/foo/bar/g
검색의 범위를 현재 커서가 놓인 줄(., current line)과 글의 끝 줄($, last line)으로 검색 범위를 한정시킨다.
:.,+2s/foo/bar/g
검색의 범위를 커서 위치줄에서 다음 2줄까지로 탐색한다.
:%s 에서 %는 현재의 커서가 위치한 줄 뿐만아니라 버퍼 아래의 모든 라인에 적용하겠다는 의미이다.(참고, :%s는 :1,$s와 같은 의미이다.)
특수문자 및 유용한 기능
1. 검색패턴에 사용되는 특수문자.
\/ -> '/'을 의미
\t -> tab을 의미
\s -> whith space를 의미
\n -> newline
\r -> Carriage Return = Ctrl-M = ^M
2. 대체할 내용에 사용되는 특수문자
\r -> newline
\n -> a null byte(0x00)
\& -> ampersand(& 는 검색 패턴이다.)
3. 다른 문자를 구분자로 사용하기
다른 문자를 구분자로 사용하는 것은 매우 유용하다. '/'를 경계를 구분하는 대신 다른 문자들로 사용하게 되면 입력을 하는데 더 빠르고 쉽게 대체를 할 수 있다.
:s#http://gooom.tistory.com/test.html#http://gooom.kr/test.html#
4. \zs와 \ze의 사용
\zs와 \ze를 사용하여 문자를 입력하는데 시간을 절약 할 수 있다.
예를 들어,
:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Recerved/
를
:s/Copyright \zs2007\ze All Rights Reserved/2008/
로 줄일 수 있다.
레지스터를 사용하기
:%s/foo/<c-r>a/g
각각의 'foo'를 레지스터'a'의 내용으로 대체한다.
<c-r>a는 Ctrl + R, A를 의미하며 Register 'a'의 내용이 즉시 입력이 된다.
:%s/foo/\=@a/g
'foo'를 레지스터 'a'의 내용으로 대체 하지만 화면에 표시 되지 않는다. 레지스터의 내용이 화면에 표시되는 것 이상의 글일 때 유용하다.
:%s/<c-r>//bar/g
마지막 검색 패턴(<c-r>/)을 'bar'로 치환 한다.
힌트. 대체할 패턴을 생략하면, 마지막 검색 패턴이 사용된다. 'r'플래그를 참조할 것.
:s/<c-r>*/bar/g
화면상에 음영 선택한 것을 bar로 대체 한다.('*'레지스터에 저장된다.)