จะเปลี่ยน catch block ใน *.java โดยใช้ sed ได้อย่างไร

วิธีแทนที่รูปแบบต่อไปนี้ในโปรเจ็กต์ Java

catch(SQLException e) {
       \\TO DO

}

กับ

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

โปรดทราบว่าไฟล์จะมีรูปแบบอื่นๆ เช่น

catch(IOException e) {
    // To Do }

ซึ่งไม่ควรเปลี่ยน

ฉันเหนื่อย

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

แต่มันใช้งานไม่ได้


person singhambesh    schedule 14.10.2010    source แหล่งที่มา
comment
โดยทั่วไป คุณคงไม่อยากทำสิ่งเหล่านั้นโดยใช้นิพจน์ทั่วไป เนื่องจาก Java ไม่ใช่ภาษาปกติ คุณต้องมีโปรแกรมแยกวิเคราะห์   -  person Roman Cheplyaka    schedule 14.10.2010


คำตอบ (2)


คุณสามารถใช้ 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 เป็นบันทึกใหม่ ไม่จำเป็นต้องมี regex ที่ซับซ้อน

person ghostdog74    schedule 14.10.2010

คุณสามารถใช้สคริปต์ 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) {
\\TO DO
}
catch(MyOwnException e){
// MORE THINGS
}
finally{

ผลลัพธ์:

try { int a = 0/0; }
catch(SQLException e) { S.O.P(); }
catch(MyOwnException e){
// MORE THINGS
}
finally{
person codaddict    schedule 14.10.2010
comment
อืม ตามคำจำกัดความของ OP MyOwnException ไม่ควรเปลี่ยนแปลง - person ghostdog74; 14.10.2010