J'ai le code suivant qui supprimera les lignes avec le motif banana
et 2 lignes après:
sed '/banana/I,+2 d' file
Jusqu'ici tout va bien! Mais j'en ai besoin pour supprimer 2 lignes avant banana
, mais je ne peux pas l'obtenir avec un «signe moins» ou autre (similaire à ce qui grep -v -B2 banana file
devrait faire mais ne le fait pas):
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
cela fonctionnera également
awk 'tolower($0)~/bandana/{print prev[!idx];print prev[idx]} {idx=!idx;prev[idx]=$0}' filein
comme il s'agit d'un commentaire et non d'une réponse (il existe déjà d'autres réponses), je n'entrerai pas dans trop de détails, mais le point crucial est que vous avez toujours le deux précédents enregistrements prev [0] et prev [1], la « plus fraîche » en fonction de l'itération , mais toujours prev[idx]
, donc quand vous imprimez, vous imprimez en !idx
puis idx
commande. Quoi qu'il en soit, alternez idx
et mettez le record en cours 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]}'
. Ce n'est pas efficace, donc ce n'est qu'un indice, pas une solution.