Suchen und Ersetzen mit sed

Suchen und Ersetzen mit sed

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.javader 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.propertiesder 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?

verwandte Informationen