Next: , Previous: Translit, Up: Text handling


10.6 正規表現でテキストの置換をする

文字列の全置換(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

次はもうすこし現実的な例です。 文字列の中にマクロupcasedowncaseの呼び出しを挿入することで、 単独の単語または文全体をキャピタライズ(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は引数を与えたときだけ認識されます。