如何使用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。这太疯狂了:)