Se o padrão não puder ocorrer em linhas consecutivas, você pode simplesmente executar
sed '$!N;/.*\n.*PATTERN.*/P;D' infile
Eu expliquei aqui como funciona o ciclo N
; P
; D
. A diferença é que aqui a primeira linha no espaço padrão é impressa apenas se a segunda for igual, caso contrário, ela será excluída.
Se o padrão puder ocorrer em linhas consecutivas, a solução acima imprimirá uma linha que corresponda se for seguida por outra linha que corresponda.
Para ignorar correspondências consecutivas, adicione uma segunda condição para imprimir a primeira linha no espaço padrão apenas se não corresponder:
sed '$!N;/.*\n.*PATTERN.*/{/.*PATTERN.*\n.*/!P;};D' infile
Outra maneira, usando o buffer de espera.
Se você quiser ignorar correspondências consecutivas:
sed '/PATTERN/!{ # if line doesn't match PATTERN
h # copy pattern space content over the hold buffer
d # delete pattern space
}
//{ # if line matches PATTERN
x # exchange pattern space with hold space
//d # if line matches PATTERN delete it
}' infile
ou, em uma linha
sed '/PATTERN/!{h;d;};//{x;//d;}' infile
Se você não quiser ignorar correspondências consecutivas:
sed '/PATTERN/!{ # if line doesn't match PATTERN
h # copy pattern space content over the hold buffer
d # delete pattern space
}
//x # if line matches PATTERN exchange buffers
' infile
ou, em uma linha
sed '/PATTERN/!{h;d;};//x' infile
Embora tenha em mente que as soluções que usam o buffer de retenção imprimirão uma linha vazia principal se a primeira linha do arquivo corresponder.