Sunday, July 19, 2009
Ant replaceregexp タスクを使う場合の注意
Makeだったら、SED で書くような処理を replaceregexp タスクで代用しているのだが、結構落とし穴がある。
< や > を含んだ文字列の置き換え
Antのビルドファイル自体が XML なので、replaceregexp の match 属性に指定する文字列中に < や > が含めることはNG。 代わりに、& lt; & gt; と記述する必要がある。
例 < tab /> を別文字列に置き換えたい場合
<target name="main">
<replaceregexp
match="<tab\s{0,1}\/>"
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" と併用した場合の話です。)
