Index > Ant replaceregexp タスクを使う場合の注意
Sun, July 19, 2009

Ant replaceregexp タスクを使う場合の注意

Makeだったら、SED で書くような処理を replaceregexp タスクで代用しているのだが、結構落とし穴がある。

< や > を含んだ文字列の置き換え

Antのビルドファイル自体が XML なので、replaceregexp の match 属性に指定する文字列中に < や > が含めることはNG。 代わりに、& lt; & gt; と記述する必要がある。

例 < tab /> を別文字列に置き換えたい場合

<target name="main">
    <replaceregexp
        match="&lt;tab\s{0,1}\/&gt;"
        replace="   "
        file="foo.txt"
        encoding="UTF-8"
        byline="true"
        flags="g" />
</taget>

byline, flags オプション

byline

これを true にしないと、最初にマッチした文字列だけしか置き換えてくれません。(Antのデフォルトの振る舞い。)
UNIXのテキスト処理ツールのほとんどが "デフォルトで行単位ですべて処理" なので、 Antのデフォルトの振る舞いは直感に反します。
行ごとにすべて処理するには、byline="true" にします。

flags

上記のように g を指定すれば、一行に複数マッチした場合すべて置き換えてくれます。 g オプションがない場合は、一つの行で最初にマッチした文字列を置き換えます。(byline="true" と併用した場合の話です。)

 Twitter
follow me on Twitter
 Categories