Usando somente sed:
<infile sed 's/expected/\n&/;s/.*\n//;s/actual/\n&/;s/\nactual.*//'
Explicação:
-
s/expected/\n&/
Coloque uma nova linha (dividir) antes deexpected
. -
s/.*\n//
Remova a linha principal que o comando anterior criou. -
s/actual/\n&/
Coloque uma nova linha (dividir) antes deactual
. -
s/\nactual.*//
Remova a linha criada acima, começando comactual
.
Observe que acima será gerada uma linha vazia se actual
estiver no início de uma linha. Se essa linha vazia precisar ser evitada, use:
<infile sed 's/expected/\n&/;s/.*\n//;/^actual/d;s/actual.*//'
Observe também que o (s) comando (s) acima manterão inalteradas todas as linhas que não corresponderem a expected
ou actual
e, em seguida, serão impressas.
Para evitar isso, anexe o /expected\|actual/!d
desta forma:
<infile sed '/expected\|actual/!d;s/expected/\n&/;s/.*\n//;/^actual/d;s/actual.*//'
Se o que é necessário é o intervalo de linhas entre expected
e actual
, mas removendo a linha à direita contendo actual
, use:
<infile sed '/^expected/!{s/expected/\n&/};/^actual/!{s/actual.*/\n&/}' |
sed '/expected/,/actual/!d;/actual/d'