2013-01-03 33 views
14

Tôi có một tệp Java. Tôi muốn bình luận bất kỳ dòng mã có chứa trận đấu:Sử dụng sed để thay thế dòng đầu tiên khi kết hợp được tìm thấy

myvar 

Tôi nghĩ sed nên giúp tôi ra đây

sed 's/myVar/not_sure_what_to_put_here/g' MyFile.java 

Tôi không biết những gì để đưa vào:

not_sure_what_to_put_here 

như trong trường hợp này, tôi không muốn thay thế myVar nhưng tôi muốn chèn

// 

vào đầu bất kỳ dòng myVar nào xảy ra.

Bất cứ lời khuyên

+0

cho đến nay cả hai câu trả lời dưới đây sẽ thực hiện công việc cho bạn. Tôi muốn nhắc nhở bạn rằng, bạn phải tinh chỉnh mẫu "myvar" của bạn để tránh thay thế bất ngờ xảy ra. ví dụ. tất cả các dòng có chứa "myVariable hoặc myVarList hoặc myVarMap hoặc Object obj = new Object; // myVar trong nhận xét" sẽ được nhận xét. – Kent

+0

@Điểm tốt. Nó phải càng chặt càng tốt. – dublintech

Trả lời

32

Chụp toàn bộ dòng có chứa myvar:

$ sed 's/\(^.*myvar.*$\)/\/\/\1/' file 

$ cat hw.java 
class hw { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); 
     myvar=1 
    } 
} 

$ sed 's/\(^.*myvar.*$\)/\/\/\1/' hw.java 
class hw { 
    public static void main(String[] args) { 
     System.out.println("Hello World!"); 
//  myvar=1 
    } 
} 

Sử dụng tùy chọn -i để lưu các thay đổi trong file sed -i 's/\(^.*myvar.*$\)/\/\/\1/' file.

Giải thích:

(  # Start a capture group 
^  # Matches the start of the line 
.*  # Matches anything 
myvar # Matches the literal word 
.*  # Matches anything 
$  # Matches the end of the line 
)  # End capture group 

Vì vậy, đây nhìn vào toàn bộ dòng và nếu myvar được tìm thấy kết quả trong lưu trữ trong nhóm chụp đầu tiên, được gọi một \1. Vì vậy, chúng tôi thay thế toàn bộ dòng \1 bằng toàn bộ dòng trước bằng 2 dấu gạch chéo trước //\1 tất nhiên các tiền tố cần thoát như không nhầm lẫn sed vì vậy \/\/\1 cũng lưu ý rằng dấu ngoặc cần thoát trừ khi bạn sử dụng tùy chọn regex mở rộng là sed.

+0

điều này có vẻ tốt. Q1 bạn có thể giải thích logic của câu trả lời của bạn? tức là những gì làm /\(^.* vv làm gì? – dublintech

+0

@dublintech xem chỉnh sửa –

+2

rực rỡ! Tôi chỉ muốn hiểu và không chỉ có được những điều thực hiện Câu trả lời tuyệt vời – dublintech

3

Hãy thử:

sed -n '/myVar/{s|^|//|};p' MyFile.java 

có nghĩa là: khi một dòng chứa myVar, thay thế các đầu dòng với //.

+0

Tôi đang trên windwons, | trở thành ¦ và tôi nhận được: '¦' không được công nhận là lệnh nội bộ hoặc bên ngoài, – dublintech

+0

ok, sau đó bạn sẽ phải sử dụng dấu gạch chéo thoát: 'sed -n '/ myVar/{s/^/\/\ // }; p 'MyFile.java' – dogbane

+0

Hoặc đặt tập lệnh vào một tệp nếu hệ điều hành của bạn (hệ điều hành khốn khổ của một cái cớ cho một hệ điều hành) không cung cấp cách để trích dẫn một chuỗi ký tự.Có lẽ dấu ngoặc kép thay vì duy nhất sẽ làm việc, mặc dù. – tripleee

2

tôi đã nghiên cứu cùng một chủ đề và tìm thấy giải pháp này là đơn giản hơn về regex

sed -e '/myvar/ s/^/\/\//' file

này cho biết thêm // tới cột 0 của phù hợp với mô hình phù hợp.

Tuy nhiên, tôi đang tìm kiếm giải pháp cho phép tôi thêm ký tự trước ký tự đầu tiên của dòng (không phải trên cột 0).

Các vấn đề liên quan