Com sed
:
sed '$!N;/remove/!P;D' infile
Isso puxa a N
linha ext para o espaço do padrão (se não estiver !
na $
linha t) e verifica se o espaço do padrão corresponde remove
. Se não existir (significa que nenhuma das duas linhas no espaço do padrão contém a sequência remove
), ela P
cria o primeiro \n
caractere de linha de linha (ou seja, imprime a primeira linha). Em seguida, D
elimina o primeiro \n
caractere de linha de linha e reinicia o ciclo. Dessa forma, nunca há mais de duas linhas no espaço do padrão.
É provavelmente mais fácil de entender o N
, P
, D
ciclo se você adicionar l
antes e após a N
olhar para o espaço padrão:
sed 'l;$!N;l;/remove/!P;D' infile
portanto, usando apenas as últimas seis linhas do seu exemplo:
8AC3
remove
8AE4
8AE5
8AE6
remove
o último comando gera:
8AC3 $
8AC3 \ n remover $
remove $
remover \ n 8AE4 $
8AE4 $
8AE4 \ n 8AE5 $
8AE4
8AE5 $
8AE5 \ n 8AE6 $
8AE5
8AE6 $
8AE6 \ n remover $
remove $
remove $
Aqui está uma breve explicação:
cmd saída 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)