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