Se qualquer linha imediatamente após uma partida for removida, seu sedprograma terá que considerar partidas consecutivas. Em outras palavras, se você remover uma linha após uma correspondência que também corresponda, provavelmente também deverá remover a linha que segue.
É implementado de maneira simples - mas você precisa olhar um pouco para trás.
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
Ele funciona trocando espaços de espera e padrão para cada linha lida - para que a última linha possa ser comparada à corrente a cada vez. Portanto, quando sedlê uma linha, ela troca o conteúdo de seus buffers - e a linha anterior é o conteúdo de seu buffer de edição, enquanto a linha atual é colocada no espaço de espera.
Portanto, sedverifica a linha anterior para uma correspondência e match, se !não for encontrada, as duas expressões na {função }são executadas. sedvai get o espaço hold, substituindo o espaço padrão - o que significa que a linha atual é, em seguida, em ambos os espaços de espera e padrão - e, em seguida, ele irá //verificar se há uma correspondência para a sua expressão regular mais recentemente compilado - match- e se ele não faz matchisso está parrumado.
Isso significa que uma linha só será impressa se não aparecer e a linha imediatamente anterior não . Também renuncia a quaisquer trocas desnecessárias para sequências de es.match matchmatch
Se você quisesse uma versão que pudesse eliminar um número arbitrário de linhas ocorrendo após uma match, seria necessário um pouco mais de trabalho:
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... substitua o 5 pelo número de linhas (incluindo a linha correspondente) que você deseja remover ...
1
2
3
4
12
13
14
21