次: Format, 前: Translit, 上: Text handling
文字列の全置換(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は引数を与えたときだけ認識されます。