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)