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

重复我对这个问题的评论 - 我认为 Java 问题最好用 Java 解决:) 虽然这可以说是由你引起的 Eclipse 帮助问题:)

制作一个 Java 程序,您可以在其中:

  • 读取属性,
  • 遍历你所有的项目 .java 文件,
  • 对于每个文件:
    • 逐行读取每个文件,
    • 使用正则表达式替换所有字符串,从加载的属性中键入,
    • 读完所有行后保存。

不是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

where+不是剩余的字符。有点麻烦,但是...

希望这可以帮助。

于 2012-04-03T23:59:44.893 回答
2

制作.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

这为您提供了一个 shell 脚本:

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 回答
-1

你不需要编程任何东西。右键单击您修改的文件之一,然后选择“替换为 >”、“本地历史记录中的上一个”。根据需要重复。

于 2012-04-03T23:36:34.233 回答