2012-04-03 29 views
0

Letzte Woche habe ich versehentlich alle meine Saiten meines Eclipse-Projekts externalisiert. Ich muss das ändern und meine einzige Hoffnung ist sed. Ich habe versucht, Skripte zu erstellen, aber es ist mir missglückt, weil ich neu bei sed bin und das wäre eine sehr komplizierte Operation. Was ich tun muss, ist dies:Suchen und Ersetzen mit sed

Strings in class.java Datei ist derzeit im folgenden Format (Methode) 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 passenden Zeichenfolgen werden in messages.properties Datei in dem 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 muss 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 zu erreichen mit sed? Oder gibt es einen leichteren Weg?

+1

So vermute ich 'VSDataSource.89' ist' String 2' in Ihrem 'messages.properties'? Möchten Sie 'Messages.getString ('VSDataSource.xxx')' durch 'yyy' aus 'VSDataSource.xxx = yyy' in' messages.properties' ersetzen? –

+0

@ mathematic.coffee ja. Der 'Schlüssel' muss nicht mit' VSDataSource' beginnen, sondern ist für jede Zeichenkette eindeutig. –

+0

Verwenden Sie Java? Hier ist eine ähnliche Sache: http://stackoverflow.com/questions/4766602/un-externals-strings-from-eclipse-or-intellij. Anstatt die Zeichenfolgen in der Java-Datei zu erstellen, können Sie alle Dateien durchsuchen und eine Regex-Suche durchführen und ersetzen. –

Antwort

3

Dies könnte für Sie arbeiten (GNU sed?):

sed 's|^\([^=]*\)=\(.*\)|[email protected]("\1")@"\2"@g|;s/\\/\\\\/g' messages.properties | 
sed -i -f - *.java 
+0

Schön. Ich würde vorschlagen, -i.bak oder etwas, nur für die Überprüfung später. –

+0

'OSListActivity.100 =/system/bootmenu/recovery/sbin/tune2fs -j' Es gibt viele Einträge wie diese in messages.properties. Also sed: file - line 52: unbekannte Option zu 's ' –

+0

Ändere einfach' s /../../ g' in 's @ .. @ .. @ g' siehe Lösung: Du kannst auch die ersten Teil und überprüfen Sie das sed generierte Skript von Hand, wenn glücklich speichern Sie es als 'temp.sed' und run' sed-f temp.sed * .java' – potong

-1

Sie müssen nichts programmieren. Klicken Sie mit der rechten Maustaste auf eine Ihrer geänderten Dateien und wählen Sie "Ersetzen durch>", "Zurück aus dem lokalen Verlauf". Wiederholen Sie dies bei Bedarf.

+0

Bitte lesen Sie die erste Zeile der Frage. Ich habe den Code nach der Externalisierung mehrfach geändert. Es ist fast unmöglich, durch Geschichte zu ersetzen. –

+0

Das wäre die Zeile, die besagt, dass Sie letzte Woche versehentlich Ihre Strings in Ihrem Eclipse-Projekt externalisiert haben? Es ist nur Dienstag, weißt du ... – phatfingers

+0

: D das ist lustig, ich habe es letzten Montag getan. –

2

zu meinem Kommentar auf die Frage wiederholen - ich denke, dass Java Probleme am besten in Java :) gelöst Obwohl dies wohl ein Eclipse-half Problem verursacht von Ihnen ist :)

ein Java-Programm Stellen in dem Du Lesen

  • die Eigenschaften,
  • Traverse alle Projekt .java-Dateien,
  • Für jede Datei:
    • lesen ea ch Datei Zeile für Zeile,
    • alle Fäden ersetzen regexps durch die Verwendung von den geladenen Eigenschaften Keying,
    • speichern, wenn Sie fertig alle Zeilen zu lesen.

Nicht nur 2 Minuten Arbeit, aber einfach genug.

Aber wenn Sie wirklich verwenden wollen sed;)

mkt.sh

$ cat mkt.sh 
# Test structure 
rm -rf a b 
mkdir a 
mkdir b 
cat > a/A.java <<EOF 
my plans for replace 
this will be left alone 
EOF 
cat > b/B.java <<EOF 
propery ginger 
broccoli tomato potato 
EOF 

display() { 
    for i in a/A.java b/B.java; do 
    echo --- $i 
    cat $i 
    done 
} 

display 

# Prop change 
echo 'echo --- Replacing in: $1' > replace.sh 
sed -r 's/([^=]+)=(.+)/sed -i '\''s#\1#\2#'\'' $1/' sample.properties >> replace.sh 
chmod u+x replace.sh 

# Replace 
find -type f -name "*.java"|xargs -n1 ./replace.sh 

# Test 
display 

Run:

$ ./mkt.sh 
--- a/A.java 
my plans for replace 
this will be left alone 
--- b/B.java 
propery ginger 
broccoli tomato potato 
--- Replacing in: ./a/A.java 
--- Replacing in: ./b/B.java 
--- a/A.java 
my plans for world domination 
this will be left alone 
--- b/B.java 
propery ginger 
steak tomato potato 

Dies sollte ordnungsgemäß auf .java-Dateien arbeiten, aber tun erstellen Sie eine Kopie vor;) Sie werden einige Probleme haben, wenn in den Strings ist, aber Sie können dies lösen, indem Sie diese aus der Eigenschaftendatei entfernen, tun a ersetzen, sie zurück und ändert diese Linie zu bringen:

sed -r 's/([^=]+)=(.+)/sed -i '\''s#\1#\2#'\'' $1/' sample.properties >> replace.sh 

z.B .:

sed -r 's/([^=]+)=(.+)/sed -i '\''s+\1+\2+'\'' $1/' sample.properties >> replace.sh 

wo + kein Rest Charakter. Ein bisschen Ärger, aber ...

Hoffe, das hilft.

+0

Ich habe Probleme, dies zu arbeiten. http://pastebin.com/nWMCHEFF –

+0

Können Sie mir ein paar (zufällige Zeilen von denen, die Fehler hatten) aus der generierten 'replace.sh' (und/oder Ihrer Eigenschaftendatei, wenn möglich) geben? –

+0

Außerdem - welches Betriebssystem, Bash-Version, Sed-Version?Das kann sehr wichtig sein, da einige von ihnen keine Optionen unterstützen (wie zum Beispiel '-r' für 'sed' oder ähnliches) –

2

makesed.awk:

BEGIN { 
    FS="="; 
    print "for i in *.java" 
    print "do" 
    print "sed \\" 
} 

{ 
    msg = "Messages.getString(\"" $1 "\")"; 
    gsub("/","\\/",$2); 
    print "-e 's/" msg "/\"" $2 "\"/g' \\" 
} 

END { 
    print "$i > $$" 
    print "mv $$ $i" 
    print "done" 
} 

Run:

awk -f makesed.awk yourpropertiesfile.dat > process.sh 

Das gibt Ihnen ein Shell-Skript:

for i in *.java 
do 
sed \ 
-e 's/Messages.getString("VSDataSource.92")/"No of rows in db "/g' \ 
-e 's/Messages.getString("VSDataSource.93")/"Verifying db entry : "/g' \ 
-e 's/Messages.getString("VSDataSource.94")/"DB is open"/g' \ 
-e 's/Messages.getString("VSDataSource.95")/"DB is closed"/g' \ 
-e 's/Messages.getString("VSDataSource.96")/"Invalid db entry for "/g' \ 
-e 's/Messages.getString("VSDataSource.97")/"\ removed."/g' \ 
$i > $$ 
mv $$ $i 
done 

Dann in Ihrem jeweiligen Java-Verzeichnisse gehen und laufen:

sh process.sh 

Das wird alle Java-Dateien in diesem Verzeichnis "reparieren".

Wenn Ihre Eigenschaftendatei lang ist, können Sie sehr gut mit sed in eine Befehlszeilenlimite hineinlaufen. Teilen Sie die Datei einfach in Blöcke auf, bis das Skript glücklich ist.

Offensichtlich funktioniert dies nicht mit einem Escape-Zeichen, wenn Sie "=" in Ihren Nachrichten haben, werden Sie auch einige Schmerzen leiden. Wenn Sie dumm genug sind, dies mit Code auszuführen, der nicht gesichert ist, dann verdienen Sie sicherlich, was auch immer Ihnen passiert.

Aber es sollte ein guter erster Start sein.

+0

"sed: -e Ausdruck # 52, Char 46: unbekannte Option zu" s "" http://pastebin.com/bCVrL2Vy –

+0

Ich fügte die gsub hinzu, um irgendwelchen/im Ersatztext zu entkommen. Das verursacht Probleme. Probieren Sie das aus, um zu sehen, ob es funktioniert. –

+0

Einige Einträge werden nicht ersetzt, sonst funktioniert das Skript einwandfrei. :) –