주절주절

문자열 치환기(vim)

트릭맨 2008. 9. 25. 10:50

(부제: 검색과 변경, 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로 대체 한다.('*'레지스터에 저장된다.)

[퍼온글입니다. 저작권은 HyStyle에게 있습니다]