Nếu bất kỳ dòng nào ngay sau một trận đấu phải được loại bỏ thì sedchương trình của bạn sẽ phải xem xét các trận đấu liên tiếp. Nói cách khác, nếu bạn loại bỏ một dòng theo sau một trận đấu cũng khớp, thì có lẽ bạn cũng nên xóa dòng đó.
Nó được thực hiện đủ đơn giản - nhưng bạn phải nhìn phía sau một chút.
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
Nó hoạt động bằng cách hoán đổi giữ và không gian mẫu cho mỗi dòng được đọc - vì vậy dòng cuối cùng có thể được so sánh với hiện tại mỗi lần. Vì vậy, khi sedđọc một dòng, nó trao đổi nội dung của bộ đệm của nó - và dòng trước đó là nội dung của bộ đệm chỉnh sửa của nó, trong khi dòng hiện tại được đặt trong không gian giữ.
Vì vậy, sedkiểm tra dòng trước cho khớp với matchvà nếu !không tìm thấy hai biểu thức trong {hàm }được chạy. sedsẽ get không gian giữ bằng cách ghi đè không gian mẫu - có nghĩa là dòng hiện tại là sau đó trong cả các tổ chức và mô hình không gian - và sau đó nó sẽ //kiểm tra xem nó cho phù hợp với cụm thường xuyên gần đây nhất là biên soạn của nó - match- và nếu nó không thực hiện matchnó được pnhuộm màu.
Điều này có nghĩa là một dòng chỉ được in nếu nó không và dòng ngay trước đó không . Nó cũng từ bỏ bất kỳ giao dịch hoán đổi không cần thiết nào cho chuỗi es.match matchmatch
Nếu bạn muốn một phiên bản có thể giảm số lượng dòng tùy ý xảy ra sau một phiên bản matchthì sẽ cần thêm một chút công việc:
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... thay thế 5 bằng số dòng (bao gồm cả dòng phù hợp) mà bạn muốn xóa ...
1
2
3
4
12
13
14
21