Buscar y reemplazar con sed

Buscar y reemplazar con sed

La semana pasada externalicé accidentalmente todas las cadenas de mi proyecto eclipse. Necesito revertir esto y mi única esperanza es sed. Intenté crear scripts pero fallé patéticamente porque soy nuevo en sed y esta sería una operación muy complicada. Lo que necesito hacer es esto:

Las cadenas del class.javaarchivo se encuentran actualmente en el siguiente formato (método) Messages.getString(<key>). Ejemplo :

    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;
            }
        }
    }

La clave y las cadenas coincidentes están en messages.propertiesun archivo con el siguiente 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

Entonces necesito el archivo java en este 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;
            }
        }
    }

¿Cómo puedo lograr esto con sed? ¿O hay una forma más fácil?

Respuesta1

El "truco" consiste en crear un 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

Comienzas con algo como:

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

Y terminar con:

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

Respuesta2

¿Sin control de fuente?tsk,tsk. Yo sugeriría arreglaresoproblema antes de ejecutar este script que funcionó para mí en una muestra muy pequeña:

#!/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

Por supuesto, cambie los argumentos a seq y sed (*java en lugar de class.java, tal vez). En serio, no hay forma de que esta sea la mejor solución a su problema. Si tiene un botón de 'externalizar cadenas', ¿no debería su IDE tener un botón de 'internalizar cadenas'?

información relacionada