Vim
에서 여러줄에 걸쳐서 발생하는 패턴을 검색하기 위해서는 약간 다른 정규표현식을 사용해야한다.
메타문자 등이 있을 때 그 바로 앞에 \_
문자열을 더해주면 되는데, 아래와 같이 자주 사용되는 표현을 예로 들자면
.
^
$
\s
다음과 같이 바꿔서 써줄 수 있고
\_.
\_^
\_$
\_s
[^A]
와 같은 문자열 클래스도 \_[^A]
로 변형해서 사용할 수 있다. 만약 아래와 같은 로그가 발생했을 때 start – end 쌍 중에서 skip 되지 않은 것을 찾고 싶은 경우
0000-01-01 00:00:01 INFO start
0000-01-01 00:00:02 INFO skip
0000-01-01 00:00:03 INFO end
0000-01-01 00:00:04 INFO start
0000-01-01 00:00:05 INFO process A-1
0000-01-01 00:00:05 INFO process A-2
0000-01-01 00:00:05 INFO process A-3
0000-01-01 00:00:06 INFO end
0000-01-01 00:00:07 INFO start
0000-01-01 00:00:08 INFO skip
0000-01-01 00:00:09 INFO end
0000-01-01 00:00:10 INFO start
0000-01-01 00:00:11 INFO process B-1
0000-01-01 00:00:11 INFO process B-2
0000-01-01 00:00:12 INFO end
0000-01-01 00:00:13 INFO start
0000-01-01 00:00:14 INFO skip
0000-01-01 00:00:15 INFO end
skip 문자열을 로그 내에 존재하지 않는 문자 한 가지로 변경 한 뒤 여기에서는 %
:%s/skip/%
다음과 같이 %
문자를 제외한 start – end 패턴을 검색하는 것으로 찾아낼 수 있다.
/start\_[^%]*end
여러줄에 걸쳐있더라도 꼭 정확하게 한 줄 씩 발생하는 패턴인 경우에는 개행 문자 \n
만을 이용해서 할 수는 있지만, 몇 줄에 걸쳐있는 패턴인지 모르는 경우 이렇게 멀티라인 검색을 이용하면 좋을 것 같다.
참고 링크
https://blog-en.openalfa.com/how-to-do-a-multiline-search-in-vim