com sed :
sed '$!N;/remove/!P;D' infile
Isso puxa a linha N ext para o espaço padrão (se não for ! na linha $ t) e verifica se o espaço padrão corresponde a remove . Se isso não acontecer (significa que nenhuma das duas linhas no espaço padrão contém a string remove ), ele P rints até o primeiro caractere \n ewline (ou seja, a primeira linha será impressa). Então, D elimina o primeiro caractere \n ewline e reinicia o ciclo. Desta forma, nunca há mais do que duas linhas no espaço padrão.
É mais fácil entender o N , P , D cycle se você adicionar l antes e depois do N para ver o espaço padrão:
sed 'l;$!N;l;/remove/!P;D' infile
então, usando apenas as últimas seis linhas do seu exemplo:
8AC3
remove
8AE4
8AE5
8AE6
remove
o último comando sai:
8AC3$
8AC3\n remove$
remove$
remove\n 8AE4$
8AE4$
8AE4\n 8AE5$
8AE4
8AE5$
8AE5\n 8AE6$
8AE5
8AE6$
8AE6\n remove$
remove$
remove$
Aqui está uma breve explicação:
cmd output cmd
l 8AC3$ N # read in the next line
l 8AC3\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ N # read in the next line
l remove\n 8AE4$ D # delete up to \n (pattern space matches so no P)
l 8AE4$ N # read in the next line
l 8AE4\n 8AE5$ # pattern space doesn't match so print up to \n
P 8AE4 D # delete up to \n
l 8AE5$ N # read in the next line
l 8AE5\n 8AE6$ # pattern space doesn't match so print up to \n
P 8AE5 D # delete up to \n
l 8AE6$ N # read in the next line
l 8AE6\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ # last line so no N
l remove$ D # delete (pattern space matches so no P)