Bagaimana cara mengganti blok catch di *.java menggunakan sed?

Bagaimana cara mengganti pola berikut dalam proyek Java

catch(SQLException e) {
       \\TO DO

}

dengan

catch(SQLException e) { S.O.P(); }

Harap dicatat bahwa file tersebut akan memiliki pola lain seperti

catch(IOException e) {
    // To Do }

yang tidak seharusnya diubah.

Saya mencoba

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

tapi itu tidak berhasil.


person singhambesh    schedule 14.10.2010    source sumber
comment
Secara umum, Anda tidak ingin melakukan hal-hal seperti itu menggunakan ekspresi reguler karena Java bukanlah bahasa reguler. Anda memerlukan pengurai.   -  person Roman Cheplyaka    schedule 14.10.2010


Jawaban (2)


Anda dapat menggunakan 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 }

Penjelasan: atur pemisah rekaman ke }. Kemudian periksa SQLException. Jika ditemukan, atur rekor $0 ke yang baru. Tidak diperlukan regex yang rumit.

person ghostdog74    schedule 14.10.2010

Anda dapat menggunakan skrip Perl ini:

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";

Contoh dijalankan:

Berkas masukan:

try { int a = 0/0; }
catch(SQLException e) {
\\TO DO
}
catch(MyOwnException e){
// MORE THINGS
}
finally{

Hasil:

try { int a = 0/0; }
catch(SQLException e) { S.O.P(); }
catch(MyOwnException e){
// MORE THINGS
}
finally{
person codaddict    schedule 14.10.2010
comment
hmm menurut definisi OP, MyOwnException tidak boleh diubah. - person ghostdog74; 14.10.2010