Pesquisar e substituir por sed

2

Na semana passada, externalizei acidentalmente todas as minhas strings do meu projeto eclipse. Eu preciso reverter isso e minha única esperança é sed. Eu tentei criar scripts, mas falhei pateticamente porque eu sou novo com sed e isso seria uma operação muito complicada. O que eu preciso fazer é isto:

As strings no arquivo class.java estão atualmente no seguinte formato (método) 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;
            }
        }
    }

As strings de chave e de correspondência estão no arquivo messages.properties 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 eu 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 há uma maneira mais fácil?

    
por Binoy Babu 04.04.2012 / 01:43

2 respostas

1

O "truque" é fazer um script sed fora do message.properties:

$ sed 's!/!\!;s!\([^=]*\)=\(.*\)!s/""/""/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
    
por 04.04.2012 / 02:48
1

Nenhum controle de fonte? tsk , tsk . Sugiro corrigir o problema antes de executar este script que funcionou para mim em um exemplo muito pequeno:

#!/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 "externalize strings", seu IDE não deve ter um botão "internalize strings"?

    
por 04.04.2012 / 02:28