先週、私は誤って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にも「文字列の内部化」ボタンを持たなければなりませんか?