sed '/Station Name/,$!d; /Data End/q'
Isso é excluir qualquer linha, exceto a primeira contendo "Nome da Estação" e até a última linha ($). Então, para aquelas linhas que escaparam do comando d
, saia se corresponder a "Data End" (mas imprima antes de sair).
Portanto, imprime as linhas entre a primeira ocorrência de "Station Name" e a primeira ocorrência de "Data End" depois disso (inclusive se estiver na mesma linha que "Data End").
Agora, se os limites devem ser omitidos, é mais complicado.
sed -ne '1,/Station Name/d; /Data End/!{p;n;}' -e q
Funcionaria, exceto se "Nome da estação" for encontrado na primeira linha ou na mesma linha que "Data End". Uma implementação de sed
permite que você se refira à linha 0
em um intervalo de linha, mas isso não é portátil. Há trabalho arounds embora. Veja o sed FAQ.
Isso fica ainda mais complicado se você quiser encontrar o texto entre a primeira ocorrência de "Station Name" e a última ocorrência de "Data End", porque, nesse caso, você nunca tem certeza Você atingiu o último "Data End" antes de chegar ao final do arquivo. sed precisaria manter as linhas vistas depois de ver um "Data End" até o final do arquivo ou a próxima ocorrência de "Data End", e porque o POSIX não requer implementações de sed para armazenar mais de 10 linhas de entrada, isso não pode ser feito de forma portável com sed
, então você precisaria usar outras ferramentas como perl ou awk ou fazer várias passagens no arquivo.