使用 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 不应该有一个“内部化字符串”按钮吗?

相关内容