【问题标题】:How to use sed or awk for editing really long Java class如何使用 sed 或 awk 编辑非常长的 Java 类
【发布时间】:2017-07-27 11:22:22
【问题描述】:

我正在为具有很多方法的类实现Decorator 模式。我创建了这个Decorator 类,并把所有应该放在这里的方法。 现在我有一个有 2000 行的类,其中每个部分都像:

@Override
public String getCapadCode()
{
    return null;
}

应替换为:

@Override
public String getCapadCode()
{
    return origin.getCapadCode();
}

是否有可能使用 sed 或 awk 以某种方式自动化此过程?

【问题讨论】:

  • 为什么你还有一个有 400 个方法的类呢?这本身就是一个危险信号。
  • 您是否考虑过其他选择,例如龙目岛? projectlombok.org/features/Delegate.html
  • 我真的不认为它可以很容易地完成,也许写一些脚本(例如在 perl 中),无论如何你确定这是一个好主意吗?你听说过 SOLID 和单一职责原则吗?
  • @all 我故意把这个问题放到sed 类别而不是java,因为设计在这里获得批准并且8 年没有改变,可能永远不会改变。我知道这段代码有代码味道,但问题是如何编辑这么大的文件
  • 在你的 IDE 中搜索替换,使用一些正则表达式

标签: java awk sed decorator


【解决方案1】:

您可以像这样使用正则表达式进行搜索和替换:

搜索: get(.*)\(\)\R\{\R return null;\R\}

替换: get$1\(\)\R\{\R return origin\.$1;\R\}

我为此使用 Eclipse 查找/替换。

【讨论】:

    【解决方案2】:

    这里有一点perl:

    perl -pe '
        m{public .* (.+)\(} and $methodName = $1; 
        s{(?<=return )null;}{origin.$methodName();};
    ' File.java
    

    如果您对它的工作感到满意,请使用perl -i -pe 调用它以就地写入。

    【讨论】:

    • 为此使用 perl。太疯狂了:)
    【解决方案3】:

    使用风险自负:

    $ awk '/^public/{name=$3} /return/{sub(/null/,"origin."name)} 1' file
    @Override
    public String getCapadCode()
    {
        return origin.getCapadCode();
    }
    

    【讨论】:

    • 这是运行返回 origin.GcrRecordWithRoundedAmounts 的结果
    • 我不知道那是什么意思,但你是说脚本没有做你想做的事吗?当您运行我在您提供的示例输入上发布的脚本时,它会产生您所说的您想要的输出,正如您在我的回答中看到的那样。如果您的示例中没有包含其他格式的输入,那么您当然不应该期望脚本知道您想使用该格式做什么。如果您想要一个适用于任何输入的完全强大的解决方案,那么您需要一个解析器来处理您输入文件所用的任何语言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2017-04-23
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2016-12-11
    相关资源
    最近更新 更多