Para remover todo o bloco de linhas que começam com uma, incluindo sua correspondência até a linha que ocorre imediatamente antes da próxima ocorrência de [T1114Base
, você pode fazer o seguinte:
sed -e'$!N;/ApplicationState.*\n/,/\n.*\[T1114Base/!P;D' <in >out
É bastante simples entender como isso funciona. Por padrão, sed
consome uma linha por vez. Mas se você quiser uma perspectiva mais ampla, você só precisa fazer o script.
Portanto, para cada linha de entrada, se a corrente for !
, não a $
última, sed
acrescentará a linha N
ext ao espaço padrão conforme delimitado por um caractere \n
ewline interveniente.
Na expressão de intervalo, primeiro procuro por qualquer correspondência para ApplicationState
seguido por qualquer *
number de qualquer .
caracteres, seguido por pelo menos um \n
ewline. Para finalizar a expressão range eu preciso dar uma olhada - que é o propósito do $!N
em primeiro lugar. sed
verifica a próxima ocorrência da linha que ocorreria após a última que você deseja remover. Ele procura por um \n
ewline seguido por um padrão que deve corresponder ao início do próximo bloco de entrada.
Se essa expressão de intervalo for !
não correspondida, sed
irá P
rint até o primeiro \n
ewline em exibição no espaço padrão e, independentemente de uma correspondência sed
, depois D
eleteará para a primeira linha nova ocorrendo no espaço padrão e reciclar para o topo do script com o que resta.
Basicamente, sed
desliza sobre linhas de entrada 2 de cada vez, possivelmente P
rinteando o mais antigo se ele não ocorrer dentro do bloco de exclusão e sempre D
apenas o mais antigo antes de anexar o N
ext.