Letzte Woche habe ich versehentlich alle Strings meines Eclipse-Projekts externalisiert. Ich muss das rückgängig machen und meine einzige Hoffnung ist sed. Ich habe versucht, Skripte zu erstellen, aber es ist kläglich gescheitert, weil ich neu bei sed bin und dies eine sehr komplizierte Operation wäre. Was ich tun muss, ist Folgendes:
Die Zeichenfolgen in class.java
der Datei liegen derzeit im folgenden Format (Methode) vor Messages.getString(<key>)
. Beispiel:
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;
}
}
}
Der Schlüssel und die passenden Zeichenfolgen befinden sich in messages.properties
der Datei im folgenden Format.
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
Also brauche ich die Java-Datei in diesem Format zurück:
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;
}
}
}
Wie kann ich dies mit erreichen sed
? Oder gibt es einen einfacheren Weg?
Antwort1
Der „Trick“ besteht darin, aus den message.properties ein Sed-Skript zu machen:
$ sed 's!/!\\!;s!\([^=]*\)=\(.*\)!s/"\1"/"\2"/g!' message.properties > message.sed
$ sed -f messages.sed class.java > class.java.reverted
$ rm messages.sed
Sie beginnen mit etwas wie:
VSDataSource.92=No of rows in db =
VSDataSource.93=Verifying db entry :
VSDataSource.NN=Foo/bar
Und am Ende steht:
s/"VSDataSource.92"/"No of rows in db= "/g
s/"VSDataSource.93"/"Verifying db entry : "/g
s/"VSDataSource.NN"/"Foo\/bar"/g
Antwort2
Keine Quellcodeverwaltung?ts,tsIch würde vorschlagen, das zu behebenDasProblem vor dem Ausführen dieses Skripts, das bei mir bei einer sehr kleinen Stichprobe funktioniert hat:
#!/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
Ändern Sie natürlich die Argumente in seq und sed (vielleicht *java statt class.java). Aber im Ernst, das ist auf keinen Fall die beste Lösung für Ihr Problem. Wenn es eine Schaltfläche zum „Externalisieren von Zeichenfolgen“ gibt, sollte Ihre IDE dann nicht auch eine Schaltfläche zum „Internalisieren von Zeichenfolgen“ haben?