Với sed
:
sed '$!N;/remove/!P;D' infile
Thao tác này kéo N
dòng ext vào không gian mẫu (nếu không phải !
trên $
dòng la t) và kiểm tra xem không gian mẫu có khớp không remove
. Nếu nó không (có nghĩa là không có một trong hai dòng trong không gian mẫu có chứa chuỗi remove
), nó P
gợi ý đến \n
ký tự ewline đầu tiên (nghĩa là nó in dòng đầu tiên). Sau đó, nó D
chạy đến \n
ký tự ewline đầu tiên và khởi động lại chu kỳ. Bằng cách này, không bao giờ có nhiều hơn hai dòng trong không gian mẫu.
Đây có thể là dễ dàng hơn để hiểu được N
, P
, D
chu kỳ nếu bạn thêm l
trước và sau khi N
nhìn vào không gian mẫu:
sed 'l;$!N;l;/remove/!P;D' infile
vì vậy, chỉ sử dụng sáu dòng cuối cùng từ ví dụ của bạn:
8AC3
remove
8AE4
8AE5
8AE6
remove
lệnh cuối cùng xuất ra:
8AC3 $
8AC3 \ n xóa $
xóa $
xóa \ n 8AE4 $
8AE4 $
8AE4 \ n 8AE5 $
8AE4
8AE5 $
8AE5 \ n 8AE6 $
8AE5
8AE6 $
8AE6 \ n xóa $
xóa $
xóa $
Đây là một lời giải thích ngắn:
cmd đầu ra cmd
l 8AC3$ N # read in the next line
l 8AC3\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ N # read in the next line
l remove\n 8AE4$ D # delete up to \n (pattern space matches so no P)
l 8AE4$ N # read in the next line
l 8AE4\n 8AE5$ # pattern space doesn't match so print up to \n
P 8AE4 D # delete up to \n
l 8AE5$ N # read in the next line
l 8AE5\n 8AE6$ # pattern space doesn't match so print up to \n
P 8AE5 D # delete up to \n
l 8AE6$ N # read in the next line
l 8AE6\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ # last line so no N
l remove$ D # delete (pattern space matches so no P)