Vim & Regex

그동안 Vim 에 관한 책을 적어도 2권은 봤고, 두꺼운 책 하나도 가끔 참고하는 정도로 보곤 했는데, 오늘 쓸 내용에 대해선 어느 책에서도 볼 수 없었다. 아주 샅샅이 찾아본 건 아니지만, 3개 책 모두, 이 내용은 빠져있었다.

그 책들은 다음과 같다.

  • 손에 잡히는 Vim
  • Hacking Vim 7.2 (Packt)
  • Learning the vi and Vim Editors: Text Processing at Maximum Speed and Power (O’Reilly)

그나마, Practical Vim(Pragmatic Bookshelf) 이란 책에서 이제부터 쓰려고 하는 내용을 찾을 수 있었다.


Vim 에서 검색은 /(전방) 와 ?(후방) 를 누른 뒤 검색하고자 하는 내용을 넣어주면 된다.
그런데, 여기서 그 놈의 ‘Escaping’ 문제가 발생한다.
뭐는 해주고, 뭐는 또 안해줘야 하는지.. 제대로 외우기가 거의 불가능하기 때문에, 그냥 검색을 하기는 무리고, 아래처럼 옵션을 주고 매칭을 시도해야 한다.

간단하게 정리해서, regex 를 사용할 때는 /\v검색어 형식을 사용하고, 일반 검색(쓰여진 그대로, 즉 Verbatim)을 하려면, /\V검색어 형식을 사용한다.

  • Regex : /\v검색어 (ex. /\vDESCRIPTION:Watch(.|\n){-}support.ecal.com)
  • Verbatim : /\V검색어 (ex. /\Va.k.a)

“DESCRIPTION:Watch(.|\n){-}support.ecal.com” 를 매칭하고 싶은데, \v 를 사용하지 않으면, 여기서도 이스케이핑 처리를 해줘야할 게 상당히 많아진다. 괄호, | 기호 등등.. 그리 되면 도무지 뭘 하려 했는지 읽을 수가 없을 정도가 된다.

또, 문자열 “a.k.a” 를 검색하고 싶은데, 그냥 /a.k.a 로 해버리면, 이상한 결과가 나타날 수도 있다. 이 검색 결과는 ackea 까지 포함해버리기 때문이다. 여기서 마침표(.)는 순수한 마침표가 아니라 Regex 에서 사용되는 wildcard 이기 때문에, ackea 의 c 나 e 까지 매치되어 버린다.

따라서, 글자 그대로 검색을 원할 때는 역슬래시 + 대문자V 를 문두에 넣고 검색을 해야 한다.

기타, Vim Regex 관련 정보는 vimregex.com 에서 찾을 수 있다.  Vim Tips Wiki 도 유용하다. 특히 Quantifiers 와 Greedy/Lazy 기호가 다르므로 주의를 요한다.
보통 Lazy 로 *? 를 쓰는데, Vim 에선 {-} 이다.

쓸 때마다 하나씩 정리해보기로 하고, 여기서는 일단..

  • Lazy : {-}
  • any character including a newline : (.|\n) 또는 \_.
Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.