Macros for text handling

기본적으로 매크로에 () 가 없으면 매크로로 인식되지 않습니다.

len

$ m4 <<\@
len(`abcdef')
len((a, b))
len()
@

6
6
0

substr

substr ( String, From, [ Length ] )

$ m4 <<\@
substr(`hello', 0, 3)
substr(`hello', 1, 3)
substr(`hello', 2)
@

hel
ell
llo
$ m4 <<\@
define(`eng',`engineering')
substr(`engineer',0,3)
@

engineering

index

index ( String, Substring )

$ m4 <<\@
index(`hello',`hel')
index(`hello',`ell')
index(`hello',`llo')
index(`not in string', `xyz')
@

0
1
2
-1      # 매칭이 없으면 -1

translit

translit ( String, Set1, Set2 )
translit ( String, Set1 )

$ m4 <<\@
translit(`little', aeiou, 12345)
translit(`little', aeiou)           # Set2 가 없으면 Set1 에 매칭되는 문자가 삭제된다.
@

l3ttl2
lttl
$ m4 <<\@
define(`ALPHA',       `abcdefghijklmnopqrstuvwxyz')
define(`ALPHA_UPPER', `ABCDEFGHIJKLMNOPQRSTUVWXYZ')

translit(`abc ebg13', ALPHA, ALPHA_UPPER)
@

ABC EBG13
----------------------------------------

$ m4 <<\@
define(`ALPHA',       `abcdefghijklmnopqrstuvwxyz')
define(`ROT13',       `nopqrstuvwxyzabcdefghijklm')

translit(`abc ebg13', ALPHA, ROT13)
@

nop rot13
$ m4 <<\@
define(`ALPHA', `abcdefghijklmnopqrstuvwxyz')
define(`ROT13', `nopqrstuvwxyzabcdefghijklm')
define(`eng',`engineering')

translit(`rat', ALPHA, ROT13)
@

engineering

regexp

regexp ( String, Regexp, [ Replacement ] )

M4 에서 regexp 은 emacs 에디터에서 사용하는 regexp 를 사용합니다. 이것은 basic regular expressions 과 비슷한데 좀 다릅니다. 가령 +, ? 문자는 escape 해서 사용하지 않습니다. 자세한 내용은 여기 를 참조하세요. ( extended regular expressions 은 m4 2.0 버전에서 제공될 거라고 합니다 )

regexp 는 Replacement 가 없으면 매칭되는 부분의 index 가 반환됩니다.

$ m4 <<\@
regexp(`hello', `l+')
regexp(`hello', `')
@

2
0

back-reference 에 의해 치환될 때 hidden 부분은 포함되지 않습니다.

$ m4 <<\@
regexp(`hello', `\(l+\).*$', `\&')
regexp(`hello', `\(l+\).*$', `\1')
regexp(`hello', `', `foo')
@

llo            # hidden 부분 ( 여기서는 he ) 는 포함되지 않는다.
ll
foo

patsubst

patsubst ( String, Regexp, [ Replacement ] )

patsubst 는 Replacement 가 없으면 매칭되는 부분이 삭제됩니다.

$ m4 <<\@
patsubst(`hello', `l+')
patsubst(`hello', `l+.*$')
@

heo
he
$ m4 <<\@
patsubst(`hello', `^', `X')                
patsubst(`hello', `^\|$', `XX')
patsubst(`hello', `l+', `XXX')
@

Xhello                
XXhelloXX
heXXXo

format

format ( format-string, . . . )

C 언어의 printf 함수와 같이 동작하는 매크로입니다. 다른 매크로와 동일하게 출력 결과에 대해서도 확장이 발생합니다. 좀 더 자세한 내용은 여기 를 참조하세요

$ m4 <<\@
define(`foo', `The brown fox jumped over the lazy dog')
format(`The string "%s" uses %d characters', foo, len(foo))
@

The string "The brown fox jumped over the lazy dog" uses 38 characters
--------------------------------------------------------

$ m4 <<\@
define(`concat', ``$*'')
define(`fsent', `format(`%-25s %-16s nfs    %-16s 0 0', `$1:$2', `$3', concat$4)')

fsent(freja, /home/gevn, /home/gevn, (rw, soft, bg, grpid))
fsent(freja, /home/freja, /home/freja, (rw, soft, grpid))
fsent(rimfaxe, /home/rimfaxe, /home/rimfaxe, (rw, soft, bg))
@

freja:/home/gevn          /home/gevn       nfs    rw,soft,bg,grpid 0 0
freja:/home/freja         /home/freja      nfs    rw,soft,grpid    0 0
rimfaxe:/home/rimfaxe     /home/rimfaxe    nfs    rw,soft,bg       0 0