Pensieve Books, Programming

Vim Search and Replace 패턴

Vim은 search and replace 기능을 위해 :s(substitute) 명령을 제공한다. 검색하고자 하는 패턴, 바꾸고자 하는 패턴이 복잡할 때는 :s 명령어도 복잡해진다. 이 포스트에서는 예제를 활용해 패턴을 활용하는 방식을 알아본다. Vim Tips Wiki에서 도움을 받았다.


다음의 명령어를 분석해보자.

:1039,1080s/\(\s\+\)\(.\+DeviceKind_CPU);\)$/\1\/\/\2/g

구분자 /를 기준으로 하나씩 나눠서 살펴보자. 아래서 ^로 표시된 문자가 구분자다. 구분자를 기준으로 앞에서부터 각각 범위, 검색 패턴, 바꾸기 패턴, 플래그를 지정한다.

:1039,1080s/\(\s\+\)\(.\+DeviceKind_CPU);\)$/\1\/\/\2/g
           ^                                ^        ^

범위 1039,1080

1039번째 줄과 1080번째 줄을 포함하여 그 사이에서 찾아바꾸기 명령을 수행한다.

검색 패턴 \(\s\+\)\(.\+DeviceKind_CPU);\)$

검색 패턴이다. 세 부분으로 더 잘게 나눠서 볼 필요가 있다.

\(\s\+\)\(.\+DeviceKind_CPU);\)$
^^^^^^^^

이 부분은 하나 이상의(\+) 연속된 whitespace(\s, 탭이나 공백)를 찾고 이 패턴을 바꾸기 패턴에서 참조할 수 있게 한다(\(, \)). 이 패턴은 \1로 참조할 수 있다.

\(\s\+\)\(.\+DeviceKind_CPU);\)$
        ^^^^^^^^^^^^^^^^^^^^^^^

이 부분은 하나 이상의(\+) 문자 혹은 공백(.)에 이어 DeviceKind_CPU);라는 문자열이 있는 패턴을 찾고 이 패턴을 바꾸기 패턴에서 참조할 수 있게 한다(\(, \)). 이 패턴은 \2로 참조할 수 있다.

\(\s\+\)\(.\+DeviceKind_CPU);\)$
                               ^

검색 패턴에서 찾은 문자열로 반드시 줄이 끝나야 한다는 의미이다.

바꾸기 패턴 \1\/\/\2

검색 패턴에서 찾은 \1 패턴과 \2 패턴 사이에 //를 추가한다.

플래그 g

존재하는 모든 패턴에 대해서 search and replace 를 수행한다.


정리하면,

:1039,1080s/\(\s\+\)\(.\+DeviceKind_CPU);\)$/\1\/\/\2/g

이 명령어는 1039 번째 줄과 1080 줄 사이에서 끝에 “DeviceKind_CPU);”라는 문자열이 존재하는 줄을 찾아서 주석처리하는 명령어다.

예컨대 다음과 같은 문서는

    launch(data1, DeviceKind_CPU);
    launch(data1, DeviceKind_GPU);
    launch(data2, DeviceKind_CPU);
    launch(data2, DeviceKind_GPU);

아래와 같이 변한다.

    //launch(data1, DeviceKind_CPU);
    launch(data1, DeviceKind_GPU);
    //launch(data2, DeviceKind_CPU);
    launch(data2, DeviceKind_GPU);