文字列の全置換(global substitution)はpatsubst
で行います。
patsubst(string, regexp, opt replacement)
string中でregexpにマッチする部分を探し、 それらをすべてreplacementに置換します。 正規表現の構文はGNU Emacsのものと同じです。
stringの中でregexpに適合するどの箇所にも含まれない部分は展開後の テキストにそのまま残ります。 マッチする箇所が見つかるたびに、 サーチはそのマッチした箇所の終りから続行されます。 したがってstring内のある文字が2回置換されることは決してありません。 regexpが長さ0の文字列にマッチしたときは、 無限ループを避けるためサーチの開始位置は1文字前に進められます。
置き換えが行われるときは、replacementに含まれる‘\n’を regexp内のカッコでくくられた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
次はもうすこし現実的な例です。
文字列の中にマクロupcase
とdowncase
の呼び出しを挿入することで、
単独の単語または文全体をキャピタライズ(capitalize)します。
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
は引数を与えたときだけ認識されます。