Ho il seguente codice che rimuoverà le righe con il modello banana
e 2 righe dopo di esso:
sed '/banana/I,+2 d' file
Fin qui tutto bene! Ma ne ho bisogno per rimuovere 2 righe prima banana
, ma non riesco a ottenerlo con un "segno meno" o qualsiasi altra cosa (simile a cosa grep -v -B2 banana file
dovrebbe fare ma non lo fa):
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
che funzionerà anche
awk 'tolower($0)~/bandana/{print prev[!idx];print prev[idx]} {idx=!idx;prev[idx]=$0}' filein
poiché questo è un commento e non una risposta (ci sono già altre risposte), non entrerò in troppi dettagli, ma il punto cruciale è che hai sempre il due precedenti record in prev [0] e prev [1], il "più fresco" a seconda dell'iterazione ma sempre in prev[idx]
, quindi quando si stampa, si stampa in ordine !idx
quindi idx
. Indipendentemente da ciò, alternare idx
e inserire il record corrente 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]}'
. Questo non è efficiente, quindi questo è solo un suggerimento, non una soluzione.