[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10. 문서를 처리하는 매크로

m4 에는 다양한 방법으로 문서를 처리하는 내장 매크로가 있다. 가령, 문자열 중에서 일부분만을 뽑아낸다던지, 또는 검색한다던지, 대치한다던지 하는 등등의 기능이 있다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.1 문자열의 길이를 계산

문자열의 길이는 len으로 계산할 수 있다.

 
len(string)

이것은 string의 길이(10진수)로 확장된다.

 
len()
⇒0
len(`abcdef')
⇒6

이 내장 매크로 len은 단지 인자가 있을 때에만 인식된다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.2 문자열 속에서 특정 문자열 찾기

문자열 속에서 특정문자열의 위치를 index로 찾을 수 있다.

 
index(string, substring)

이것은 string에서 substring이 처음으로 나타나는 인덱스로 확장된다. string의 첫문자의 인덱스는 0이다. substringstring 안에 나타나지 않는다면 index는 ‘-1’로 확장된다.

 
index(`gnus, gnats, and armadillos', `nat')
⇒7
index(`gnus, gnats, and armadillos', `dag')
⇒-1

내장매크로 index는 인자가 있을 때에만 인식된다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.3 정규표현식 검색하기

정규표현식 검색은 내장 매크로 regexp로 할 수 있다.

 
regexp(string, regexp, opt replacement)

이것은 string에서 regexp를 검색한다. 정규표현식은 GNU Emacs 에서와 동일하다. See (emacs)Regexps section ‘Syntax of Regular Expressions’ in The GNU Emacs Manual.

replacement가 생략된다면, regexp는 문자열에서 regexp와 첫번째로 일치 하는 인덱스로 확장된다. 문자열에서 일치하는 regexp를 찾지 못했다면 ‘-1’로 확장된다.

 
regexp(`GNUs not Unix', `\<[a-z]\w+')
⇒5
regexp(`GNUs not Unix', `\<Q\w*')
⇒-1

replacement가 있다면, regexp는 확장을 replacement로 한다. regexpregexpn번째 보조표현식과 일치하는 텍스트에 따라 ‘\n’으로 대치된다. ‘\&’는 일치하는 정규표현식 전체가 된다.

 
regexp(`GNUs not Unix', `\w\(\w+\)$', `*** \& *** \1 ***')
⇒*** Unix *** nix ***

내장 매크로 regexp는 단지 인자가 있을 때에만 인식된다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.4 문자열에서 특정한 문자열을 뽑기

문자열중에서 특정한 부분 문자열은 substr로 뽑아낼 수 있다.

 
substr(string, from, opt length)

이것은 string의 부분 문자열로 확장된다. string에서 from 인덱스부터 시작하여 length 길이만큼 늘이거나 length가 생략되었다면 string의 끝까지로 된다. 하나의 문자열에서 시작 인덱스는 항상 0이다.

 
substr(`gnus, gnats, and armadillos', 6)
⇒gnats, and armadillos
substr(`gnus, gnats, and armadillos', 6, 5)
⇒gnats

내장 매크로 substr은 인자가 있을 때에만 인식된다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5 문자를 변환하기

문자를 변환하는 것은 translit을 사용한다.

 
translit(string, chars, replacement)

이것은 stringchars에 있는 문자와 같은 인덱스의 replacement 문자와 교체하여 변환한다.

만일 replacementchars보다 짧다면, 초가하는 문자는 확장에서 없어진다. replacement가 생략되었다면, string에서 chars에 나타나는 모든 문자들은 확장에서 제거된다.

charsreplacement 둘다 문자범위를 포함할 수 있다. ‘a-z’(모든 소문자), ‘0-9’(모든 10진수)등등… charsreplacement 에서 줄문자(‘-’)를 하나의 일반문 자로 포함하려면 처음이나 마지막에 위치시켜야 한다.

문자의 범위에서 그 값이 처음보다 마지막이 더 작은 것은 에러가 아니다. 이 경우에 그 범위는 거꾸로 될 것이다. ‘9-0’은 ‘9876543210’을 의미한다.

 
translit(`GNUs not Unix', `A-Z')
⇒s not nix
translit(`GNUs not Unix', `a-z', `A-Z')
⇒GNUS NOT UNIX
translit(`GNUs not Unix', `A-Z', `z-a')
⇒tmfs not fnix

첫번째 예는 모든 대문자를 삭제하는 것이고, 두 번째 변환은 소문자를 대문 자로 바꾸는 것이며, 세 번째는 모든 대문자를 거꾸로 뒤집에서 소문자로 변환한 것이다. 처음 두 개의 경우는 보통 범용적으로 쓰인다.

내장 매크로 translit은 인자가 있을 경우에만 인식된다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.6 정규표현식으로 텍스트를 대치하기

문자열에서 전체 대치는 patsubst를 사용한다.

 
patsubst(string, regexp, opt replacement)

이것은 string에서 regexp와 일치하는 것이 있는 가를 검사한다. 그러고 난뒤 에 일치하는 각각을 replacement로 대치한다. 정규표현식의 문법은 GNU Emacs 와 같다.

string에서 regexp와 일치하지 않는 부분은 그대로 복사되면서 확장된다. 일치하는 것이 발견되면, 다음 검색은 이전에 일치했던 다음부분부터 진행된다. 따라서 string에서 하나의 문자는 두 번 대치되지 않는다. regexp가 문자열에서 1 이상의 길이만큼 일치하지 않는다면, 검색 시작위치는 무한한 반복을 피하기 위해 하나 증가한다.

replacement가 있다면, regexp는 확장을 replacement로 한다. regexpregexpn번째 보조표현식과 일치하는 텍스트에 따라 ‘\n’으로 대치된다. ‘\&’는 일치하는 정규표현식 전체가 된다.

replacement 인자가 생략된다면 regexp와 일치하는 텍스트는 삭제된다.

 
patsubst(`GNUs not Unix', `^', `OBS: ')
⇒OBS: GNUs not Unix
patsubst(`GNUs not Unix', `\<', `OBS: ')
⇒OBS: GNUs OBS: not OBS: Unix
patsubst(`GNUs not Unix', `\w*', `(\&)')
⇒(GNUs)() (not)() (Unix)
patsubst(`GNUs not Unix', `\w+', `(\&)')
⇒(GNUs) (not) (Unix)
patsubst(`GNUs not Unix', `[A-Z][a-z]+')
⇒GN not 

좀 더 실제적인 예를 들어보자. 이것은 어떤 단어나 전체 문장을 매크로 upcasedowncase를 사용하여 문자열을 대치하는 매크로를 호출하는 것이다.

 
define(`upcase', `translit(`$*', `a-z', `A-Z')')dnl
define(`downcase', `translit(`$*', `A-Z', `a-z')')dnl
define(`capitalize1',
`regexp(`$1', `^\(\w\)\(\w*\)', `upcase(`\1')`'downcase(`\2')')')dnl
define(`capitalize',
`patsubst(`$1', `\w+', `capitalize1(`\&')')')dnl
capitalize(`GNUs not Unix')
⇒Gnus Not Unix

내장 매크로 patsubst는 인자가 있을 때에만 인식된다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.7 형식화된 출력

형식화된 출력은 format으로 만들 수 있다.

 
format(format-string, ...)

이것은 C 함수인 printf와 아주 비슷하다. 처음 인자는 형식화된 문자열이고, 여기에는 ‘%’ 특수문자가 올수 있다. format은 형식화된 문자열로 확장된다.

이것은 몇 개의 예제만으로도 아주 훌륭하게 사용되는 것을 살펴볼 수 있다.

 
define(`foo', `The brown fox jumped over the lazy dog')
⇒
format(`The string "%s" is %d characters long', foo, len(foo))
⇒The string "The brown fox jumped over the lazy dog" is 38 characters long

forloop 매크로의 정의는 See section 루프와 재귀. 이 예는 format이 표와 비슷한 출력을 만들어 내는 방법을 보여준다.

 
forloop(`i', 1, 10, `format(`%6d squared is %10d
', i, eval(i**2))')
⇒     1 squared is	    1
⇒     2 squared is	    4
⇒     3 squared is	    9
⇒     4 squared is	   16
⇒     5 squared is	   25
⇒     6 squared is	   36
⇒     7 squared is	   49
⇒     8 squared is	   64
⇒     9 squared is	   81
⇒    10 squared is	  100

format 내장 매크로는 ANSI C ‘printf’ 함수가 설계된 이후에 모델화 되었고, 보통 ‘%’ 특수문자와 ‘c’, ‘s’, ‘d’, ‘o’, ‘x’, ‘X’, ‘u’, ‘e’, ‘E’, ‘f’를 제공한다. 이것은 또한 필드 넓이와 정밀도, 그리고 ‘+’, ‘-’, ‘ ’, ‘0’, ‘#’, ‘h’, ‘l’과 같은 변경자를 제공한다. 더 자세한 정보는 C 라이브러리 매뉴얼의 ‘printf’ 함수 부분을 보라.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Autobuild on August 22, 2016 using texi2html 1.82.