【问题标题】:How to replace java code block to another code block automatically or pragramatically?如何自动或以编程方式将 java 代码块替换为另一个代码块?
【发布时间】:2015-08-14 00:45:20
【问题描述】:

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

例如 我的项目有大约 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 的解决方案。

【问题讨论】:

  • 那不是 DRY。我会考虑如何将其重构为可以修改一次并多次调用的方法。像 IntelliJ 这样严肃的 IDE 可以做到。
  • 我已经更新了我的问题,即代码块中的对象obj 对于不同的文件是不同的
  • 并且有超过 300 个文件,所以我需要自动化它,所以我猜 IDE 不会帮助我
  • 为什么不使用java,例如问题在python中很容易解决
  • 是的,这可以通过 python 或任何其他支持文件输入输出的编程语言来解决。对于 python,我们可以使用 fileinput 模块进行就地编辑。

标签: java regex awk sed text-processing


【解决方案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

【讨论】:

    【解决方案2】:

    这个怎么样

    $ searchvar=`cat searchblock.txt`  
    $ replvar=`cat replblock.txt`  
    
    $ sed -i ":loop; $! N; tloop;  s/$searchvar/$replvar/g" *.java
    

    searchblock.txt 中,您将放置输入块等等,使用*.java,您将捕获文件夹中的所有 java 文件

    注意` 不是'

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 2021-11-15
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      相关资源
      最近更新 更多