如何使用sed或awk编辑很长的Java类

如何使用sed或awk编辑很长的Java类,java,awk,sed,decorator,Java,Awk,Sed,Decorator,我正在为这个有很多方法的类实现一个Decorator模式。我创建了这个Decorator类,并将所有应该在这里的方法放在这里。 现在我有一个2000行的课程,每个部分都像: @Override public String getCapadCode() { return null; } 应替换为: @Override public String getCapadCode() { return origin.getCapadCode(); } 是否可以使用sed或awk以某种方式

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

@Override
public String getCapadCode()
{
    return null;
}
应替换为:

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

是否可以使用sed或awk以某种方式自动执行此过程?

您可以使用搜索并替换为正则表达式,如下所示:

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

替换:
获取$1\(\)\R\{\R返回原点\.$1;\R\}


我使用EclipseFind/Replace实现这一点。

您可以使用如下正则表达式进行搜索和替换:

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

替换:
获取$1\(\)\R\{\R返回原点\.$1;\R\}

我使用Eclipse查找/替换来实现这一点。

这里有一点perl:

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

perl -pe '
    m{public .* (.+)\(} and $methodName = $1; 
    s{(?<=return )null;}{origin.$methodName();};
' File.java
perl-pe'
m{public.*(.+)\(}和$methodName=$1;
s{(?使用风险自担:

$ awk '/^public/{name=$3} /return/{sub(/null/,"origin."name)} 1' file
@Override
public String getCapadCode()
{
    return origin.getCapadCode();
}
自担风险使用:

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

为什么你要用400种方法来上课?这本身就有点红旗。你有没有考虑过其他的选择,比如龙目岛?我真的不认为它可以很容易地完成,也许写一些脚本(比如Perl)。相反,无论如何,你确定这是个好主意吗?你听说过SOLID和Single Responsibility Principle吗?@我故意把这个问题放到
sed
类别而不是
java
,因为设计在这里获得批准,8年来没有更改过,可能永远也不会更改。我知道这个代码S代码的气味,但仍然是问题,如何编辑这样一个大的文件搜索替代在IDE中,一些ReGuestOf为什么你有一个类有400种方法?这有点红旗本身。你有没有考虑其他选项像龙目岛?我真的不认为它可以很容易地做到,也许写一些脚本(在Perl中)相反,无论如何,你确定这是个好主意吗?你听说过SOLID和Single Responsibility Principle吗?@我故意把这个问题放到
sed
类别而不是
java
,因为设计在这里获得批准,8年来没有更改过,可能永远也不会更改。我知道这个代码s代码有味道,但问题是如何在IDE中编辑这么大的文件搜索替换,使用一些regexp。这是运行return origin.gcrrecordwithroundedamounts的结果。我不知道这意味着什么,但你是说脚本没有做你想做的事情吗?当你运行我在示例输入上发布的脚本时,它会生成正如您在我的回答中所看到的,您所说的您想要的输出。如果您的示例中没有包含其他格式的输入,那么您当然不应该期望脚本知道您想要对该格式执行什么操作。如果您想要一个完全健壮的解决方案,可以处理任何输入,那么您需要一个适用于任何语言的解析器u输入文件被写入。这是运行return origin.gcrrecordwithroundedamounts的结果。我不知道这意味着什么,但你是说脚本没有做你想做的事情吗?当你运行我在你提供的示例输入上发布的脚本时,它会产生你在我的回答中所说的你想要的输出。如果有其他形式对于示例中未包含的输入,您当然不应该期望脚本知道您要对该格式执行什么操作。如果您想要一个完全健壮的解决方案,可以处理任何输入,那么您需要一个解析器来解析您输入文件所用的任何语言。使用perl进行此操作。这很疯狂:)为此使用perl。这太疯狂了:)