2011-11-30 2 views
12

Tôi có lệnh sau: sed -i -e '/match1/,+2d' filex, sẽ xóa 2 dòng sau khi tìm kết quả phù hợp "match1" trong tệp "tệp x". Tôi muốn thêm một số kết quả phù hợp với nó, như match1, match 2 ....Làm cách nào để sử dụng "sed" để xóa 2 dòng sau khi khớp/khớp?

Vì vậy, nó sẽ xóa 2 dòng sau khi tìm thấy bất kỳ kết quả nào, làm thế nào tôi có thể đạt được điều này?

+0

bạn có thể trao một ví dụ đầu vào/đầu ra để làm cho nó rõ ràng hơn những gì bạn mong đợi? – sehe

+0

Có gì sai trong trường hợp của bạn với '/ match1 /, + 2d;/match2 /, + 2d' rõ ràng không? Nó sẽ không nhận ra sự trùng lặp, nhưng biểu hiện ban đầu của bạn thì không. – thiton

+0

Có thể trùng lặp [sed hoặc awk: xóa n dòng theo mẫu] (https://stackoverflow.com/questions/4396974/sed-or-awk-delete-n-lines-following-a-pattern) –

Trả lời

20

Hai cách khác nhau, tùy thuộc vào phiên bản sed và nền tảng:

sed -e '/match1/,+2d' -e '/match2/,+2d' <oldfile> newfile 

hoặc

sed -e '/match1\|match2/,+2d' <oldfile> newfile 
+0

cảm ơn người đàn ông này chỉ là những gì tôi muốn – wael

+3

tại sao sau đó đây không phải là một câu trả lời được chấp nhận? – Drew

5

Không phải là một người sử dụng sed nhưng có vẻ như với tôi bạn có thể sử dụng:

sed -i -e '/(match1|match2)/,+2d' filex 

Nếu không, bạn có thể, nếu bạn có thể làm như vậy, hãy làm:

sed -i -e '/match1/,+2d' filex && sed -i -e '/match2/,+2d' filex 

EDIT: Có vẻ như tôi đã có ý tưởng đúng nhưng ziu đã hiểu.

4

Nếu tôi hiểu bạn một cách chính xác, bạn muốn

sed -e '/match1/,+2d' input.txt 

Ví dụ, tạo đầu vào với seq 10 | sed '3i match1' > input.txt:

1 
2 
match1 
3 
4 
5 
6 
7 
8 
9 
10 

Kết quả của sed -e '/match1/,+2d' input.txt sẽ là:

1 
2 
5 
6 
7 
8 
9 
10