Se qualquer linha imediatamente após uma partida for removida, seu programa sed
terá que considerar correspondências consecutivas. Em outras palavras, se você remover uma linha após uma correspondência que também corresponde, provavelmente você também deve remover a linha seguinte.
Ele é implementado simplesmente o suficiente - mas você precisa olhar para trás um pouco.
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
Funciona trocando espaço de espera e padrão para cada linha lida - então a última linha pode ser comparada com a atual a cada vez. Então, quando sed
lê uma linha, ele troca o conteúdo de seus buffers - e a linha anterior é então o conteúdo de seu buffer de edição, enquanto a linha atual é colocada em espaço de espera.
Portanto, sed
verifica a correspondência da linha anterior com match
e, se o !
não encontrou as duas expressões na {
function }
, são executadas. sed
irá g
et o espaço de armazenamento sobrescrevendo o espaço de padrão - o que significa que a linha atual está nos espaços de retenção e padrão - e então //
irá verificar se há uma correspondência com sua compilação regular mais recente expressão - match
- e se ele não match
é p
rinted.
Isso significa que uma linha só é impressa se não match
e a linha imediatamente anterior não match
. Ele também renuncia a quaisquer trocas desnecessárias para seqüências de match
es.
Se você quisesse uma versão que pudesse derrubar um número arbitrário de linhas que ocorressem depois de um 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ê gostaria de remover ...
1
2
3
4
12
13
14
21