Tôi có đoạn mã sau sẽ loại bỏ các dòng có mẫu banana
và 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 file
nê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 !idx
sau đó idx
theo thứ tự. Bất kể, thay thế idx
và đư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.