如何自动或通过语法将java代码块替换为另一个代码块?

时间:2015-05-31 14:30:04

标签: java regex awk sed text-processing

我有很多java源文件,我想在我的项目中的每个java文件中将代码块更改为另一个代码块。

e.g。 我的项目有大约300个java源文件,每个文件都有这个代码块

while (p.getCurrentToken() != JsonToken.END_OBJECT) {
    p.nextToken();
    field = p.getCurrentName();
    obj.populateFromJsonString(field, p);
} 

我想将此代码块替换为

while (p.nextToken() != null) {
    field = p.getCurrentName();
    if(field!=null){
        obj.populateFromJsonString(field, p);
    }
}

在所有java文件中。代码块中的对象obj对于不同的文件是不同的

我知道这可以通过使用sedawk进行文字处理来完成。我正在考虑编译器读取和解析java源文件的方式的替代解决方案。可能有一些基于这种方式的应用程序来解决我的问题。

请分享方式或申请来解决这个问题。基于sed / awk的解决方案也很受欢迎。

2 个答案:

答案 0 :(得分:1)

最好使用IDE来执行此操作,但如果您真的想使用sed,请将其放在名为j.sed的文件中

/while (p\.getCurrentToken() != JsonToken\.END_OBJECT) {/{
    :loop
    n
    /}/b    
    s/field = p\.getCurrentName();/if (field!=null) {/
    s/p\.nextToken();/field = p\.getCurrentName();/
    s/...\.populateFromJsonString(field, p);/\t&\n\t}/
    b loop
}

然后在命令行中使用

find . -type f -name '*.java' -exec sed -i.bak -f j.sed {} \;

这将输入:

while (p.getCurrentToken() != JsonToken.END_OBJECT) {
    p.nextToken();
    field = p.getCurrentName();
    obj.populateFromJsonString(field, p);
} 

输出:

while (p.getCurrentToken() != JsonToken.END_OBJECT) {
    field = p.getCurrentName();
    if (field!=null) {
        obj.populateFromJsonString(field, p);
    }
} 

-i.bak将在适当位置编辑并将备份存储为filename.java.bak

答案 1 :(得分:-2)

这个怎么样

$ searchvar=`cat searchblock.txt`  
$ replvar=`cat replblock.txt`  

$ sed -i ":loop; $! N; tloop;  s/$searchvar/$replvar/g" *.java

searchblock.txt中你将把inputblock放在哪里,用*.java你将捕获文件夹中的所有java文件

通知`不是'

在测试-i就地编辑时要小心,您可以尝试使用备份文件