sedで検索と置換

sedで検索と置換

先週、Eclipse プロジェクトのすべての文字列を誤って外部化しました。これを元に戻す必要があり、唯一の望みは sed です。スクリプトを作成しようとしましたが、sed は初めてで、これは非常に複雑な操作になるため、惨めに失敗しました。必要な操作は次のとおりです。

ファイル内の文字列はclass.java現在次の形式(メソッド)になっていますMessages.getString(<key>)。例:

    if (new File(DataSource.DEFAULT_VS_PATH).exists()) {
        for (int i = 1; i <= c; i++) {
            if (!new File(DataSource.DEFAULT_VS_PATH
                    + Messages.getString("VSDataSource.89") + i).exists()) { //$NON-NLS-1$
                getnewvfspath = DataSource.DEFAULT_VS_PATH
                        + Messages.getString("VSDataSource.90") + i; //$NON-NLS-1$
                break;
            }
        }
    }

キーと一致する文字列はmessages.properties次の形式でファイル内にあります。

VSDataSource.92=No of rows in db = 
VSDataSource.93=Verifying db entry : 
VSDataSource.94=DB is open
VSDataSource.95=DB is closed
VSDataSource.96=Invalid db entry for 
VSDataSource.97=\ removed.
key=string

したがって、Java ファイルを次の形式で戻す必要があります。

    if (new File(DataSource.DEFAULT_VS_PATH).exists()) {
        for (int i = 1; i <= c; i++) {
            if (!new File(DataSource.DEFAULT_VS_PATH
                    + "String 2" + i).exists()) { //$NON-NLS-1$
                getnewvfspath = DataSource.DEFAULT_VS_PATH
                        + "String 1" + i; //$NON-NLS-1$
                break;
            }
        }
    }

どうすればこれを実現できますかsed? または、もっと簡単な方法はありますか?

答え1

「トリック」は、message.properties から sed スクリプトを作成することです。

$ sed 's!/!\\!;s!\([^=]*\)=\(.*\)!s/"\1"/"\2"/g!' message.properties > message.sed
$ sed -f messages.sed class.java > class.java.reverted
$ rm messages.sed

次のようなものから始めます:

VSDataSource.92=No of rows in db = 
VSDataSource.93=Verifying db entry : 
VSDataSource.NN=Foo/bar

そして最終的には次のようになります:

s/"VSDataSource.92"/"No of rows in db= "/g
s/"VSDataSource.93"/"Verifying db entry : "/g
s/"VSDataSource.NN"/"Foo\/bar"/g

答え2

ソース管理はありませんか?チッチッ修正することをお勧めしますそれこのスクリプトを実行する前に問題が発生しましたが、非常に小さなサンプルではうまくいきました。

#!/bin/bash
set -x
for i in `seq 92 97`
do
    X=$(sed -n s/^VSDataSource.$i=//p messages.properties)
    sed -i "s+Messages.getString(\"VSDataSource.`echo $i`\")+\"`echo $X`\"+g" class.java
done

もちろん、引数を seq と sed に変更します (おそらく、class.java ではなく java)。しかし、真面目な話、これが問題に対する最善の解決策であるはずがありません。「文字列を外部化」ボタンがあるなら、IDE にも「文字列を内部化」ボタンがあるべきではないでしょうか。

関連情報