- PR -

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

投稿者投稿内容
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-11-24 15:13
引用:

直接見えていなのは、改行コード でしょうか


・・・え??改行コードじゃ無い可能性もあるんですか?
ina
ベテラン
会議室デビュー日: 2005/04/14
投稿数: 58
投稿日時: 2005-11-25 00:18
文字コードが違うとか。
・UTF-8かなんかで出力されたファイルを開いてコピー、テキストエディタに貼り付け(Shift_JIS)
って感じで上手くいっているのでは?
(あくまでも想像ですが....)

まぁ、いずれにしろバイナリエディタで違いを比べてみるのが確実かと思います。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-11-25 11:11
inaさん、ご返答ありがとうございます。
引用:

まぁ、いずれにしろバイナリエディタで違いを比べてみるのが確実かと思います。


アドバイスどおりバイナリエディタで確認してみたところ、行末の文字コードが
違ってました。自動生成したファイルはLF(ラインフィールド)のみで改行、
ECLIPSEで作成したファイルはCR+LFで改行を表現してるようです。
CRは改行コードではなくて復帰コードと呼ぶこともWEBで知りました。
MMXさんがおっしゃる改行コード以外のコードはこのコードのことだったのですね、
勉強になりました。

しかしながらまだ解決には至っていません。LFのみの改行コードをANTが無視してる
感じがします。以下に実験結果とソース、ANTファイルの一部を載せます。

************** test.java *********************
置換する文字列
,
damie);

これをバイナリエディタのデータでは
2C 0D 0A 64 61 6D 69 65 29 3B

ANTでの定義
<replace dir="${toBuildDir}" value=";">
<include name="test.java" />
<replacetoken>,&#x0D;&#x0A;damie;</replacetoken>
</replace>

以上のようにTESTファイルは問題ないです。ちなみにANTのreplacetokenのところを
<replacetoken>,&#x0A;damie;</replacetoken>
のようにLFだけにしても改行として判断されるようですね。junさんの実験
でもこのあたりはご指摘いただいています。今度はLFのみで改行を表現する
ファイルを操作してみると失敗しました。

************** MainAction.java *********************
置換する文字列
,
damie);

これをバイナリエディタのデータでは
2C 0A 64 61 6D 69 65 29 3B

ANTでの定義
<replace dir="${toBuildDir}" value=");">
<include name="*Action.java" />
<replacetoken>,&#x0A;damie;</replacetoken>
</replace>

できませんでした。ちなみに、文字列を全部16進数にして、
<replacetoken>&#x2C;&#x0A;&#x64;&#x61;&#x6D;&#x69;&#x65;&#x29;&#x3B;</replacetoken>
これでもできませんでした。testファイルは文字列を全部16進数にしても
大丈夫です。OSによって改行の表現が違うというのは分かったのですが、
windowsではLFのみの改行は文字では無いので無視するのでしょうか・・・。
日本語を含んだファイルではないので、結局は文字コードを変換する操作
で解決しそうな感じです。参考にしたサイトにやり方が載ってました。

テキスト・ファイルの行末コードを変更する

単純な操作ながら、Xdocletで自動生成されるクラスは100近くあるので
大幅な修正後のジェネレートも考えると手動で操作するのは現実的では
なさそうです。置換ができそうでできないのがなんとももどかしいですが、
何か他にいい方法は無いものでしょうか?
もしありましたら引き続きよろしくお願いします。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-11-25 13:34
ヘルプを読んだのですが、AntのReplaceタグのマルチライン置換は
「プラットフォーム依存の改行コード」にのみ対応するようですね。

探して回るより、JavaのString#replace()などを利用して、正規表
現でマッチをかけて置換するようなツールアプリを自作するのが一
番の近道かもしれません。

take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-11-25 15:26
シュンさん、ご返答ありがとうございます。
引用:

ヘルプを読んだのですが、AntのReplaceタグのマルチライン置換は
「プラットフォーム依存の改行コード」にのみ対応するようですね。

探して回るより、JavaのString#replace()などを利用して、正規表
現でマッチをかけて置換するようなツールアプリを自作するのが一
番の近道かもしれません。


お手数かけまして申し訳ないです。
その方が早いかなとはうすうす感じていたのですが、なかなか諦め
が悪いたちだったもので・・・。
自作して対応することにします。
皆様のご返答&閲覧に感謝いたします。ありがとうございました。

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