Nếu bất kỳ dòng nào ngay sau một trận đấu phải được loại bỏ thì sed
chươ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, sed
kiểm tra dòng trước cho khớp với match
và nếu !
không tìm thấy hai biểu thức trong {
hàm }
được chạy. sed
sẽ g
et 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 match
nó được p
nhuộ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
match
match
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 match
thì 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