antのreplaceregrexタスクを使って複数行置換!

前回に引き続きantでreplace文字列のreplaceです~
今回は、ある複数行からある複数行に置換する方法です。

例えばあるファイル(test.xml)内にある①のような複数行の文字列を②に置換したいとします。


<hoge name="a">
aaaa
</hoge>


<piyo name="b">
bbbb
</piyo>

その場合以下のようにreplaceregrexタスクで記載します。

その場合、replace

<replaceregexp file="./test.xml" encoding="UTF-8" flags="gs" replace="&lt;piyo name=&quot;b&quot;&gt;&#10;bbbb&#10;&lt;/piyo&gt;">
<regexp pattern="&lt;hoge name=&quot;a&quot;&gt;.*?aaaa.*?/hoge&gt;" />
</replaceregexp>

のようになります。

ポイントは、flagsに設定している"gs"と文字のエスケープです。


【flagsに設定している"gs"】

g:繰り返し
regexpタスクで指定したpatternに指定した1度該当しても置換を継続して行う。
s:シングルラインモード
通常"."は\nを除く任意の一文字を示すが、シングルラインモードでは、
"."は\nを含む一文字を示します。
シングルラインモードに設定することで、複数行の内容のファイルを1行として扱うことが出来るので、複数行にまたがる正規表現が比較的簡単にかけます。
【文字をエスケープ】
replaceregexpタスクのreplace属性に置換後の複数行の内容を記載するときや
regexpタスクのpattern属性を記載するときは、
antはxml形式で記載するので、xmlの記載方法にのっとって記載しなければなりません。
xmlでは、改行コード、ダブルクオート、<,>をエスケープしないとうまく文字を認識してくれないので、以下のようにエスケープします。

< &lt;
> &gt;
LF &#10;
CR &#13;

例では、改行をLFのみで示しています。
インデントの部分を広報参照で書ければ汎用性が高くなおよいと思いますが、
例では、おこなっていません。

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

0 Response to "antのreplaceregrexタスクを使って複数行置換!"

コメントを投稿