- - PR -
ANTで改行を含む文字列の置換
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||
|
投稿日時: 2005-11-20 23:57
まずマニュアルのとおりに書いてみてはいかがですか。
「CDATA」などの文字列は、意味があるんだと思いますよ。 | ||||
|
投稿日時: 2005-11-21 13:08
シュンさん、ご返答ありがとうございます。
おっしゃるように、[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なので自分が見たマニュアルよりちょっとだけ 新しいみたいです。 このくらいのバージョンの違いで動作しないって事は考えにくい ですよね・・・?まったく無いわけじゃないと思いますけど。 もうちょっと自分でも調べてみたいと思います。 引き続きよろしくお願いします。 | ||||
|
投稿日時: 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
bar</replacetoken> </replace> </target> </project> test.text foo bar baz Ant実行後 test.text foo baz | ||||
|
投稿日時: 2005-11-22 10:03
その後CDATAを使ってやってもうまくいくので,もしかすると二行目の前の空白が問題なのでは
| ||||
|
投稿日時: 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> のようにすれば行をまたがらない場合可能だけど行をまたぐ場合の正規表現については わからない | ||||
|
投稿日時: 2005-11-24 12:20
junさん、ご返答いただきありがとうございます。
junさんの情報をもとにいろいろ試した結果を報告します。 今回testにあたって新しいjavaファイルをECLIPSE上で 作成して複数行のリプレイスを試してみました。 結論から申し上げますと成功しました。 空白を含んでいてもANTのCDATAセクションの空白数が 置換対象文字列と空白数が一緒なら大丈夫なようです。 しかし、testファイルではなくて、私が置換したいと思って いたjavaファイルはtestで使用した文字列と同じでも複数行だと無理なようです。 一行だったら何も問題がありません。 そのファイルというのもXdocletというジェネレートツールを 使用して自動生成したファイルなのです。それが原因かどうかは 分かりませんが、自分で把握している大きな違いはそれです。 Xdocletで自動生成した文字列をtestファイルにコピペして リプレイスさせてみるとうまくいくのでますます分からないです。 この辺はどうやって調べたらいいのでしょうか・・・。 | ||||
|
投稿日時: 2005-11-24 13:44
直接見えていなのは、改行コード でしょうか
自動の同一視はエデイターでよくあります [ メッセージ編集済み 編集者: MMX 編集日時 2005-11-24 15:27 ] |