Se qualquer linha imediatamente após uma partida for removida, seu sed
programa 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 sed
lê 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, sed
verifica a linha anterior para uma correspondência e match
, se !
não for encontrada, as duas expressões na {
função }
são executadas. sed
vai g
et 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 match
isso está p
arrumado.
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
match
match
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