使用 sed 搜尋並替換

使用 sed 搜尋並替換

上週我不小心將 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?或者有更簡單的方法嗎?

答案1

「技巧」是根據 message.properties 建立一個 sed 腳本:

$ sed 's!/!\\!;s!\([^=]*\)=\(.*\)!s/"\1"/"\2"/g!' message.properties > message.sed
$ sed -f messages.sed class.java > class.java.reverted
$ rm messages.sed

你可以從這樣的事情開始:

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

最終結果是:

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

答案2

沒有原始碼控制?嘖嘖,嘖嘖。我建議修復在運行這個對我來說在一個非常小的樣本上有用的腳本之前出現問題:

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

當然,將參數更改為 seq 和 sed (也許是 *java 而不是 class.java)。但說實話,這不可能是解決您問題的最佳方案。如果它有一個「外部化字串」按鈕,那麼您的 IDE 不應該有一個「內部化字串」按鈕嗎?

相關內容