0

先週、私は誤って eclipse プロジェクトのすべての文字列を外部化してしまいました。これを元に戻す必要があり、唯一の希望は sed です。私はスクリプトを作成しようとしましたが、私は sed を初めて使用し、これは非常に複雑な操作になるため、哀れに失敗しました。私がする必要があるのはこれです:

class.javaファイル内の文字列は現在、次の形式 (メソッド)Messages.getString(<key>)です。例 :

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

キーと一致する文字列はmessages.properties、次の形式でファイルに含まれています。

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

したがって、Java ファイルを次の形式に戻す必要があります。

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

どうすればこれを達成できsedますか? それとももっと簡単な方法がありますか?

4

4 に答える 4

4

これはあなたのために働くかもしれません(GNU sed?):

sed 's|^\([^=]*\)=\(.*\)|s@Messages.getString("\1")@"\2"@g|;s/\\/\\\\/g' messages.properties |
sed -i -f - *.java
于 2012-04-04T00:31:18.277 に答える
2

made.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" 
}

走る:

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

これにより、シェルスクリプトが得られます。

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

次に、それぞれの Java ディレクトリに移動して、次を実行します。

sh process.sh

これにより、そのディレクトリ内のすべての Java ファイルが「修正」されます。

プロパティ ファイルが長い場合、sed でコマンド ラインの制限に達する可能性があります。スクリプトがうまくいくまで、ファイルをチャンクに分割するだけです。

明らかに、これはエスケープ文字では機能しません。メッセージに「=」が含まれていると、同様に苦労します。バックアップされていないコードでこれを実行するほど愚かな場合は、何が起こっても当然のことです。

しかし、それは良い最初のスタートになるはずです。

于 2012-04-04T00:10:46.540 に答える
2

質問に対する私のコメントを繰り返すために-Javaの問題はJavaで解決するのが最善だと思います:)これは間違いなくあなたが引き起こしたEclipse支援の問題です:)

次のことができる Java プログラムを作成します。

  • プロパティを読み取り、
  • プロジェクトのすべての .java ファイルをトラバースし、
  • 各ファイルについて:
    • 各ファイルを 1 行ずつ読み取り、
    • 正規表現を使用してすべての文字列を置き換え、ロードされたプロパティからキーイングし、
    • すべての行を読み終えたら保存します。

2 分の作業ではありませんが、簡単です。

しかし、本当に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

走る:

$ ./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

これは .java ファイルで適切に機能するはずですが、前にコピーを作成してください ;) が文字列に含まれていると問題が発生#ますが、プロパティ ファイルからこれらを削除し、置換を行い、元に戻して変更することで解決できます。この行:

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

例えば:

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

+は残りの文字ではありません。ちょっと面倒ですが…

お役に立てれば。

于 2012-04-03T23:59:44.893 に答える
-1

何もプログラムする必要はありません。変更したファイルの 1 つを右クリックし、[置換 >]、[ローカル履歴からの前] を選択します。必要に応じて繰り返します。

于 2012-04-03T23:36:34.233 に答える