Tuesday, March 27, 2012 / Bash, Java

Java のパッケージ名を xargs と sed を使って別のパッケージ名に一括書きかえする

Eclpse などの IDE を使っていれば、Java パッケージ名の変更は簡単にできますが、 ここではターミナル上でさっと変更する方法をメモしておきます。

vim などでターミナルベースで Java のコードを書いていると、 いちいち IDE を起動するのは面倒なので、ターミナル上だけで操作が完結するこの方法は意外に重宝します。

もちろん、ここで説明する方法は単なるテキスト置換に過ぎないので、パッケージ名変更以外にも使うことができます。

sed を使ってパッケージ名を置換

sed は正規表現を使ってテキストを置換するのに便利なツールです。 ここでは、正規表現などは使わないで単に指定した文字列を置換するだけです。

MacOSX に標準でインストールされている sed は /usr/bin/sed などにありますが これは インプレースオプションといわれる -i オプションをサポートしていないようです。

MacOSX をお使いの場合は GNU sed をインストールしておいた方がよいでしょう。

さて本題ですが、 Main.java の パッケージ名 foo.hoge を foo.hogehoge に sed で置換するには、 コマンドラインで以下のようにすればよい。

sed 's/package foo.hoge/package foo.hogehoge/' Main.java > Main.java.fixed
mv Main.java.fixed Main.java

-i オプションを使えば

sed 's/package foo.hoge/package foo.hogehoge/' -i Main.java

とするだけです。

さらに、置換コマンド s/package foo.hoge/package foo.hogehoge/ を conv.sed に保存した上で

sed -f conv.sed -i Main.java 

とすることもできます。

find と xargs を使って複数の java ファイルを一括で置換

通常は一つの java ファイルを置換するのではなく、複数のファイルを置換することになると思います。

その場合は xargs と組み合わせることで簡単に複数ファイル一括置換が実現できます。

find ./ -name "*.java" | xargs sed -f conv.sed -i

これだけです。

xargs コマンドはほんとに神ですね。