Ich habe den folgenden Code, der Zeilen mit dem Muster banana
und 2 Zeilen danach entfernt:
sed '/banana/I,+2 d' file
So weit, ist es gut! Ich brauche es, um 2 Zeilen vorher zu entfernen banana
, aber ich kann es nicht mit einem "Minuszeichen" oder was auch immer bekommen (ähnlich wie was grep -v -B2 banana file
tun soll, aber nicht):
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
du auch machen können
awk 'tolower($0)~/bandana/{print prev[!idx];print prev[idx]} {idx=!idx;prev[idx]=$0}' filein
Da dies ein Kommentar und keine Antwort ist (es gibt bereits andere Antworten), werde ich nicht zu sehr ins Detail gehen, aber der springende Punkt ist, dass Sie immer die haben vorherige zwei Datensätze in vorh [0] und zurück [1], die „frischeste“ je nachdem , welche Iteration aber immer in prev[idx]
, also wenn Sie drucken, die Sie in !idx
dann idx
bestellen. Unabhängig davon, wechseln Sie ab idx
und fügen Sie den aktuellen Datensatz ein 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]}'
. Dies ist nicht effizient, daher ist dies nur ein Hinweis, keine Lösung.