A maioria dos sed s não imprime a última linha se você N on $ . Mas GNU sed será. Portanto, se o padrão que você deseja excluir estiver na última linha e você N será impresso. Às vezes é melhor manter o buffer cheio - como sempre mantendo 2 linhas exceto nas linhas que você não deseja imprimir. Você pode fazer assim:
seq 10 | sed -n 'x;/7/!g;//!p'
Esse é um exemplo com seq como entrada. Em cada linha, as trocas ocupam espaço e espaço padrão. Se a última linha mantida não corresponder a 7 (neste caso) ela irá sobrescrever o espaço de espera com a linha atual. Em seguida, ele verifica novamente que a linha que acabou de inserir - a linha atual - também não corresponde à 7 , caso contrário, não será impressa. Então, em cada linha, ele verifica a linha anterior e a atual.
1
2
3
4
5
6
9
10
E se seu padrão cair na última linha:
seq 10 | sed -n 'x;/10/!g;//!p'
1
2
3
4
5
6
7
8
9
Outro exemplo, para demonstrar com mais clareza o que será e não será impresso:
sed -n 'x;/match/!g;//!p
' <<\DATA
match
match
1not
2not
3not
4not
5not
match
6not
match
DATA
OUTPUT
2not
3not
4not
5not