본문 바로가기

인디자인 InDesign/정규표현식 GREP

[PK]1장 예시로 살펴보는 GREP(인디자인을 위한 GREP)

피터 카렐(Peter Kahrel)은 네덜란드 출신 스크립터로 인디자인 스크립트 분야에서 꽤 유명한 사람이다. 본래 언어학자로 대학에 있다가 출판업계로 전업을 하면서 인디자인을 집중적으로 탐구하게 되었다고 한다. 언어학에 조예가 깊은 까닭인지, 인디자인을 둘러싼 갖가지 '언어'들(자바스크립트와 GREP 등)의 전문가다. CS 초기 버전부터 자바스크립트(정확히는 익스텐드스크립트)와 GREP에 대한 교과서적인 단행본을 출간해왔고, 그 때문에 오래전부터 업계의 구루(guru)로 알려졌다. GREP을 다룬 책은 GREP in InDesign이라는 이름으로 출간됐는데, 2019년에 3판이 나왔다(현재 크리에이티브프로와 아마존에서 판매하고 있다). 게시글을 통해 번역할 텍스트도 GREP in InDesign 3판이다. 앞으로 'PK' 두문자어를 앞에 단 게시글을 통해 피터 카렐의 영문판 저서를 일정부분 번역해 공유해보도록 하겠다.

 

GREP1이 어떻게 작동하는지 살피는 좋은 방법은 몇 가지 예시로 살펴보는 것이다. 그렇지만 우선 GREP이 지닌 강점을 파악하기 위해 인디자인 텍스트 검색과 GREP을 빠르게 비교해보겠다.

인디자인 텍스트 검색은 주로 리터럴(문자 그대로의) 텍스트를 검색하는 데 사용된다. 예를 들어 'cats'를 검색하면 문자 그대로 그것만 검색되는 것이다(그렇기에 대소문자 구분이나 전체 단어만 검색어로 하는 설정은 무시된다). 물론 (찾기/바꾸기)[텍스트] 탭에서도 와일드카드를 쓸 수 있다. 예를 들어 ^9는 모든 숫자, ^$는 모든 글자, ^?는 모든 문자, ^w는 모든 공백을 찾는다. 그러므로 Figure^w^9를 입력하면 리터럴 텍스트 Figure 다음에 공백과 숫자가 있는 경우를 검색한다. 이러한 와일드카드를 쓰면 더는 리터럴 텍스트만이 아닌 패턴을 찾는 게 된다. [텍스트] 탭의 와일드카드 네 가지는 유용하지만 '바꾸기'에는 쓸 수 없고 '찾기'에만 사용할 수 있는 등 다소 제한적이다.

반면 GREP에서는 패턴을 찾는 게 주된 일이다. 예를 들어 한 자리 숫자 만이 아닌 여러 자리 숫자를 찾을 수 있다. Figure \d+는 어떤 종류든(2, 34, 121 등) 숫자가 뒤따르는 리터럴 텍스트 Figure와 일치한다. \d는 숫자를, 그 뒤 더하기 기호는 '하나 이상'을 의미한다. GREP 표현식 \u\l+는 라틴 대문자 \u 뒤에 여러 개의 라틴 소문자 \l+가 오는 경우를 찾는다. 또한 GREP은 간단한 선택을 할 수 있다. centre와 center를 모두 찾으려면 cent(re|er)를 검색하는 경우가 그렇다. 선택 항목은 파이프 기호( | )로 구분된다. 선택지가 있다는 것은 더 큰 유연성을 부여한다. 예를 들어 선택 항목으로 단수와 복수 형태를 모두 찾고자 cent(re|er)s?를 검색하는 경우를 살펴볼 수 있다. 물음표는 s가 있든 없든 일치해야 한다는 뜻이다. 그렇게 이 간단한 GREP은 centre, centres, center, centers를 찾는다.

문자 클래스로 유연성은 더 커진다. 예를 들어 p[aeiouy]t는 p 뒤에 모음 하나가 오고 그 뒤에 t가 오는 경우와 일치하기에 pat, pet, pit, pot, put을 찾을 수 있다(다만 python에서 'pyt'spat에서 'pat' 같은 경우가 있을 수 있다. 나중에 전체 단어만 검색하는 방법을 살펴보겠다). 이러한 예시는 또한 사용자가 자신만의 와일드카드를 정의하는 방식을 보여주기도 한다. 앞서 본 경우는 모든 모음을 괄호로 묶어([aeiouy]) '모음' 와일드카드를 정의한 거라고 할 수 있다. '어센더 문자'를 묶은 [bdfhkl]나 '디센더 문자'를 묶은 [gjpqy]는 그와 같이 자체 제작한 와일드카드다.

GREP 표현식은 텍스트 패턴의 스타일을 지정하는 데 쓰일 수 있다. 예를 들어 라틴 대문자가 두 개 이상인 경우에 '작은 대문자' 문자 스타일을 적용하려면 [찾을 내용] 필드에 '\u\u+'를 입력하고, [바꿀 내용] 필드를 비워두고 [서식 변경] 필드에 스타일을 지정하면 된다. 반복하자면 \u는 라틴 대문자에 대한 와일드카드이고 더하기 기호는 '하나 이상'을 뜻하므로, \u\u+는 라틴 대문자 두 개 이상인 문자열과 일치한다.

Figure 예시로 돌아가서 와일드카드를 바꾸기와 함께 사용하는 방법을 설명하겠다. Figure라는 단어가 그림을 나타내는 데 쓰일 때(즉 숫자가 뒤 따르는 경우) 그것을 Map으로 바꾸려면, Figure(\d)를 찾고 Map $1로 바꾼다. \d는 모든 숫자를, \d를 둘러싼 괄호는 괄호 내용을 포착할 것을 나타낸다. 바꿀 내용에 $1은 찾을 내용에서 괄호로 포착한 것과 일치하므로 Figure 1은 Map 1로, Figure 2는 Map 2 식으로 바뀐다.

마지막 예시로 어려워 보이는 작업을 가져왔는데, 간단한 표현식으로도 많은 걸 할 수 있다는 사실을 보여주고자 한다. 여러분에게 사람들의 이메일 주소가 포함된 주소 목록이 있고, 이제부터 각각의 이메일 주소 앞에 Email:이라는 단어를 추가하는 일을 해야 한다고 하자. 이때 @가 다른 용도로 쓰이지 않았다고 가정하면, @ 기호가 포함된 글줄은 모두 이메일 주소다.

이제 필요한 건 '@가 포함된 글줄 시작 부분에 Email:을 추가하라'고 말하는 표현식 두 가지다. 그림 1에 필요한 표현식이 있다. @가 포함된 문단 시작 부분을 찾고자 사용된 표현식은 실제로 ^(.+@)처럼 간단하다. Email:을 시작 부분에 삽입하려면, 바꿀 내용에 그걸 그대로 쓰고 $1을 덧붙이기만 하면 된다. $1은 찾을 내용 표현식에서 괄호 안에 있는 부분을 포착한 것이며, 문단 시작 부분부터 @를 포함한 부분까지의 텍스트를 의미한다. 그림 1 문서에서 강조된 부분으로 확인할 수 있다. 그림을 보면 첫 번째 주소에 대해 작업을 끝냈고, 이제 막 두 번째 주소를 바꾸는 상황임을 알 수 있다. 당장 자세하게 파고들지는 않겠다. 이후의 장을 통해 그림에서의 작업이 어떻게 되고 있는 건지 설명할 것이다(간단히만 하자면 ^는 '문단 시작'을, .+@는 '@를 포함한 부분까지의 모든 문자(.)가 하나 이상(+)'인 경우를 뜻한다). 다시 말하자면 세부 사항들은 텍스트로 추후에 명확해질 것이다. 우리가 본 예시의 핵심은 짧고 간단한 표현식으로도 많은 걸 할 수 있다는 사실이다.

그림 1 내용을 고려한 문단 텍스트 추가


1 GREP은 'Global Regular Expression Print('Parser'라고 하는 경우도 있다)의 약자로, 코드 패턴 검색을 수행하는 유닉스(UNIX) 명령행 유틸리티에서 유래했다. 근래 출시한 텍스트 편집기 대부분은 찾기/바꾸기 기능으로 GREP(일명 RegEx, 정규표현식)을 지원한다.