Na semana passada, externalizei acidentalmente todas as strings do meu projeto Eclipse. Preciso reverter isso e minha única esperança é sed. Tentei criar scripts, mas falhei pateticamente porque sou novo no sed e isso seria uma operação muito complicada. O que eu preciso fazer é o seguinte:
As strings no class.java
arquivo estão atualmente no seguinte format(method) Messages.getString(<key>)
. Exemplo :
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;
}
}
}
A chave e as Strings correspondentes estão no messages.properties
arquivo no seguinte formato.
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
Então preciso do arquivo java de volta neste formato:
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;
}
}
}
Como posso fazer isso com sed
? Ou existe um caminho mais facil?
Responder1
O "truque" é criar um script sed a partir de message.properties:
$ sed 's!/!\\!;s!\([^=]*\)=\(.*\)!s/"\1"/"\2"/g!' message.properties > message.sed
$ sed -f messages.sed class.java > class.java.reverted
$ rm messages.sed
Você começa com algo como:
VSDataSource.92=No of rows in db =
VSDataSource.93=Verifying db entry :
VSDataSource.NN=Foo/bar
E termine com:
s/"VSDataSource.92"/"No of rows in db= "/g
s/"VSDataSource.93"/"Verifying db entry : "/g
s/"VSDataSource.NN"/"Foo\/bar"/g
Responder2
Sem controle de origem?tsk,tsk. Eu sugeriria consertarqueproblema antes de executar este script que funcionou para mim em uma amostra muito pequena:
#!/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
Claro, mude os argumentos para seq e sed (*java em vez de class.java, talvez). Sério, porém, não há como essa ser a melhor solução para o seu problema. Se tiver um botão 'externalizar strings', seu IDE não deveria ter um botão 'internalizar strings'?