Sed comando para excluir uma linha com base na próxima linha

-1

Por favor, compartilhe o comando sed para excluir uma linha com base na string de duas linhas.

Por exemplo, eu tenho o texto abaixo:

AAAAA
BBBBBB
 aaa 
bbb
 USING INDEX
)
aaaa
 USING INDEX
        TABLESPACE IDX_TAB3
)

Se uma linha contiver USING INDEX e a próxima linha contiver ) , ela deverá ser excluída. Neste eu tenho que apagar a 5 ª linha sozinho, mas não deve excluir a 8 ª linha. A saída deve ser como abaixo:

AAAAA
BBBBBB 
aaa 
bbb
)
aaaa
 USING INDEX
  TABLESPACE IDX_TAB3
)
    
por asalthangam 29.09.2016 / 21:26

3 respostas

2

Você pode manter um buffer de duas linhas, imprimindo a primeira linha somente se ela não corresponder ao seu padrão de duas linhas:

$ sed ':a; $!N; /USING INDEX.*\n.*)/!P; D; ba' file
AAAAA
BBBBBB
 aaa
bbb
)
aaaa
 USING INDEX
        TABLESPACE IDX_TAB3
)

Observe que o acima permite zero ou mais caracteres finais após o padrão USING INDEX e zero ou mais caracteres iniciais antes do ) - se sua entrada for representativa, ou seja, houver uma nova linha imediatamente após USING INDEX , seguida imediatamente por parênteses, então você poderia simplificar isso para

sed ':a; $!N; /USING INDEX\n)/!P; D; ba' file
    
por steeldriver 29.09.2016 / 22:01
1

Este script awk faz o truque:

#!/usr/bin/awk -f
(NR>1 && !(index($0, ")") && index(last, "USING INDEX"))) {
  print last;
}

{
  last=$0;
}

END{
  print;
}
    
por David Foerster 29.09.2016 / 21:49
1
awk '/USING INDEX/ {this=$0; getline; if (! /^[[:blank:]]*\)/) print this} 1'
    
por glenn jackman 29.09.2016 / 22:13