Processamento de texto - Localizar texto antes / depois da palavra dada

0

Gostaria de extrair conteúdo entre Station Name e Data End do arquivo:

Estrutura do arquivo de texto para esclarecimento:

---- Huge text -- not interested
Station Name 
100 - 200 lines
Data End
---- Again text --- 

Como eu poderia facilmente extrair os dados?

Para perguntar em geral, como podemos encontrar os dados em uma determinada seção e depois processá-los (excluir / substituir ... etc), ou seja, antes de uma palavra específica? ou depois de uma palavra específica? ou entre eles?

Saída desejada

Caso 1: Do começo à palavra / padrão fornecido Caso 2: Entre 2 palavras / padrão fornecido Caso 3: Da palavra / padrão para o final do arquivo.

    
por mtk 18.10.2012 / 21:23

1 resposta

4
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.

    
por 18.10.2012 / 21:26