- PR -

ANTで改行を含む文字列の置換

投稿者投稿内容
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-11-20 23:22
いつもお世話になります。ECLIPSE3.0のANTを使用してJAVAファイル内の
文字列の一部を置換しようと思っています。その文字列は改行が含まれ
ていて、

<replace dir="${toBuildDir}" token="from_str" value="to_str">
<include name="*.java"/>
</replace>

のような書き方ではできず、

<replace dir="${src}" value="wombat">
<include name="**/*.html" />
<replacetoken><[CDATA[multi line
token]]></replacetoken>
</replace>

のような書き方をする必要があるとANTのマニュアルにありました。
しかしながらいろいろやってみてもなかなかうまくいきません。
やりたいことは、JAVAファイル内メソッドの引数で

dao.insertAuthorityMgr(
objFrm.getRegistrationDate(),
damie);

このようになってるのを

dao.insertAuthorityMgr(
objFrm.getRegistrationDate());

こういう状態にしたいのです。
ちなみに自分が定義したものをコピペすると、

<replace dir="${toBuildDir}" value=");">
<include name="*.java" />
<replacetoken>,
damie);</replacetoken>
</replace>

これです。ビルドは成功という風にプロンプトには表示されます。
でも中身は変わってません。
ご存知の方がいらっしゃいましたらご教示いただきたくお願い
いたします。



[ メッセージ編集済み 編集者: take 編集日時 2005-11-20 23:26 ]
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-11-20 23:57
まずマニュアルのとおりに書いてみてはいかがですか。
「CDATA」などの文字列は、意味があるんだと思いますよ。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-11-21 13:08
シュンさん、ご返答ありがとうございます。
引用:

まずマニュアルのとおりに書いてみてはいかがですか。
「CDATA」などの文字列は、意味があるんだと思いますよ。


おっしゃるように、[CDATA]は意味を持っていました。
XMLで文字列を定義する時に使えるセクションで、<や>など、
XMLで意味を持つタグもそのまま使えるみたいです。
書き直してANTで定義しなおしたのが下記になります。

<replace dir="${toBuildDir}" value=");">
<include name="*Action.java" />
<replacetoken><![CDATA[,
damie);]]></replacetoken>
</replace>

これでもだめでした。ちなみに改行をエスケープシーケンスにして、

<replace dir="${toBuildDir}" value=");">
<include name="*Action.java" />
<replacetoken><![CDATA[,\n damie);]]></replacetoken>
</replace>

これでも無理みたいです。
参考にしたサイトです。
ANTマニュアル
XMLでのCDATA

ANTのバージョンが関係してるのかもしれないと思い確認してみたら
ECLIPSE3.0のANTは1.6.2なので自分が見たマニュアルよりちょっとだけ
新しいみたいです。
このくらいのバージョンの違いで動作しないって事は考えにくい
ですよね・・・?まったく無いわけじゃないと思いますけど。

もうちょっと自分でも調べてみたいと思います。
引き続きよろしくお願いします。
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2005-11-22 09:53
本当はCDATAセクションを使って出来ないといけないと思うのだけど取りあえず
次のようなテストではうまくいきました

build.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<project default="replace">
<target name="replace">
<replace dir="." value="foo">
<include name="test.text"/>
<replacetoken>foo&#xA;bar</replacetoken>
</replace>
</target>
</project>

test.text

foo
bar
baz

Ant実行後

test.text

foo
baz
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2005-11-22 10:03
その後CDATAを使ってやってもうまくいくので,もしかすると二行目の前の空白が問題なのでは
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2005-11-22 12:09
ちょっと自分でやってみたのですが

<?xml version="1.0" encoding="Shift_JIS"?>
<project default="replace">
<target name="replace">
<copy file="src.text" tofile="dest.text">
<filterchain>
<tokenfilter>
<replaceregex pattern="foo,\s*bar" replace="foo" flags="gi"/>
</tokenfilter>
</filterchain>
</copy>
</target>
</project>

のようにすれば行をまたがらない場合可能だけど行をまたぐ場合の正規表現については
わからない
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-11-24 12:20
junさん、ご返答いただきありがとうございます。
junさんの情報をもとにいろいろ試した結果を報告します。

今回testにあたって新しいjavaファイルをECLIPSE上で
作成して複数行のリプレイスを試してみました。
結論から申し上げますと成功しました。
空白を含んでいてもANTのCDATAセクションの空白数が
置換対象文字列と空白数が一緒なら大丈夫なようです。

しかし、testファイルではなくて、私が置換したいと思って
いたjavaファイルはtestで使用した文字列と同じでも複数行だと無理なようです。
一行だったら何も問題がありません。
そのファイルというのもXdocletというジェネレートツールを
使用して自動生成したファイルなのです。それが原因かどうかは
分かりませんが、自分で把握している大きな違いはそれです。
Xdocletで自動生成した文字列をtestファイルにコピペして
リプレイスさせてみるとうまくいくのでますます分からないです。

この辺はどうやって調べたらいいのでしょうか・・・。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-11-24 13:44
直接見えていなのは、改行コード でしょうか
自動の同一視はエデイターでよくあります

[ メッセージ編集済み 編集者: MMX 編集日時 2005-11-24 15:27 ]

スキルアップ/キャリアアップ(JOB@IT)