Unix 如何使用sed替换*.java中的catch块?

Unix 如何使用sed替换*.java中的catch块?,unix,shell,sed,awk,Unix,Shell,Sed,Awk,如何在java项目中替换以下模式 catch(SQLException e) { \\TO DO } 与 请注意,该文件将有其他模式,如 catch(IOException e) { // To Do } 这是不应该改变的 我试过了 sed 's/catch\(SQLException[^\}]*}/catch(SQLException e)\{S.O.P();\}/g' file.java 但是它不起作用。您可以使用以下Perl脚本: use strict; m

如何在java项目中替换以下模式

catch(SQLException e) {
       \\TO DO

}

请注意,该文件将有其他模式,如

catch(IOException e) {
    // To Do }
这是不应该改变的

我试过了

sed 's/catch\(SQLException[^\}]*}/catch(SQLException e)\{S.O.P();\}/g' file.java

但是它不起作用。

您可以使用以下Perl脚本:

use strict;

my $file = '';
$file.=$_ while(<>);
$file=~s[catch\s*\(\s*SQLException\s*(\w+)\)\s*\{.*?\}][catch(SQLException $1) { S.O.P(); }]sg;
print $file."\n";
结果:

try { int a = 0/0; }
catch(SQLException e) { S.O.P(); }
catch(MyOwnException e){
// MORE THINGS
}
finally{
你可以用awk

$ more file
catch(SQLException e) {
       \\TO DO

}
catch(IOException e) {
    // To Do }

$ awk -vRS="}" '/catch\(SQLException e\)/{$0="catch(SQLException e) { S.O.P();" }NR{print $0RT}  ' file
catch(SQLException e) { S.O.P();}

catch(IOException e) {
    // To Do }

说明:将记录分隔符设置为
}
。然后检查
SQLException
。如果找到,请将记录
$0
设置为新记录。不需要复杂的正则表达式。

一般来说,您不希望使用正则表达式执行此类操作,因为Java不是一种正则语言。您需要一个parser.hmm根据OP的定义,
MyOwnException
不应更改。
try { int a = 0/0; }
catch(SQLException e) { S.O.P(); }
catch(MyOwnException e){
// MORE THINGS
}
finally{
$ more file
catch(SQLException e) {
       \\TO DO

}
catch(IOException e) {
    // To Do }

$ awk -vRS="}" '/catch\(SQLException e\)/{$0="catch(SQLException e) { S.O.P();" }NR{print $0RT}  ' file
catch(SQLException e) { S.O.P();}

catch(IOException e) {
    // To Do }