Tôi có đoạn mã sau sẽ loại bỏ các dòng có mẫu bananavà 2 dòng sau nó:
sed '/banana/I,+2 d' file
Càng xa càng tốt! Nhưng tôi cần loại bỏ 2 dòng trước đó banana , nhưng tôi không thể lấy nó bằng một dấu trừ trừ dấu hiệu hay bất cứ thứ gì (tương tự như những gì grep -v -B2 banana filenên làm nhưng không được):
teresaejunior@localhost ~ > LC_ALL=C sed '-2,/banana/I d' file
sed: invalid option -- '2'
teresaejunior@localhost ~ > LC_ALL=C sed '/banana/I,-2 d' file
sed: -e expression #1, char 16: unexpected `,'
teresaejunior@localhost ~ > LC_ALL=C sed '/banana/I,2- d' file
sed: -e expression #1, char 17: unknown command: `-'
tac file | sed ... | tac. : P
sed '/banana/,+2d' file điều đó cũng sẽ làm việc
awk 'tolower($0)~/bandana/{print prev[!idx];print prev[idx]} {idx=!idx;prev[idx]=$0}' filein Vì đây là nhận xét và không phải là câu trả lời (đã có câu trả lời khác), tôi sẽ không đi sâu vào chi tiết, nhưng mấu chốt của nó là bạn luôn có hai kỷ lục trước đó trong trước [0] và trước [1], là "tươi" tùy thuộc vào sự lặp lại nhưng luôn luôn trong prev[idx], vì vậy khi bạn in, bạn in trong !idxsau đó idxtheo thứ tự. Bất kể, thay thế idxvà đưa hồ sơ hiện tại vào prev[idx].
awk '{l[m=NR]=$0}/banana/{for(i=NR-2;i<=NR;i++)delete l[i]}END{for(i=1;i<=m;i++)if(i in l)print l[i]}'. Điều này không hiệu quả, vì vậy đây chỉ là một gợi ý, không phải là một giải pháp.