Regex para registros de data e hora e linhas correspondentes

0

Eu tenho um arquivo de texto escrito em humanos que contém carimbos de hora em forma de dd-mm-yyyy , HH:MM ou HH:MM:SS . Eu consegui extrair carimbos de tempo de arquivo de texto usando regex mas eu também gostaria de obter uma linha de carimbo de hora correspondente. Seria bom ter carimbos de hora em um arquivo e linhas correspondentes no outro. Pode haver vários carimbos de hora por linha, portanto, a mesma linha deve ocorrer várias vezes.

Se isso puder ser feito, e se eu quiser apenas poucas palavras ou poucas linhas em torno de um registro de data e hora. A ideia é apenas obter carimbos de hora e seu contexto extraído.

Por enquanto eu tenho usado o matlab para isso, mas qualquer ferramenta * nix serve.

Edit: parece que nem todas as ferramentas funcionam. Eu estou usando mac e às vezes portátil bash git para windows. Pelo menos o grep do mac não suporta mais opções -P para o perl regex que aparentemente é necessário para procurar em torno de (?<![0-9])

Aqui está um exemplo do arquivo original e das saídas desejadas:

original:

L&L logfile

14-5-12
16-05-2012
Experiment 1
Device 77212-123-123123
Instrument 2, 34g, 66hz
Notes:
Something weird happened 12:34
Everything is fine 13:07
Log
8:00 routine 1
8:20 routine 2
8:40 routine 3, 8:45 something went south
8:50 routine 4, 8:50:12 weird peak at data

output1:

14-5-12
16-05-2012
12:34
13:07
8:00
8:20
8:40
8:45
8:50
8:50:12

output2:

14-5-12
16-05-2012
Something weird happened 12:34
Everything is fine 13:07
8:00 routine 1
8:20 routine 2
8:40 routine 3, 8:45 something went south
8:40 routine 3, 8:45 something went south
8:50 routine 4, 8:50:12 weird peak at data
8:50 routine 4, 8:50:12 weird peak at data
    
por Lesenger 29.07.2016 / 09:33

1 resposta

0

grep -Eo '[0-9.]{10},[0-9]{2}:[0-9]{2}(:[0-9]{2})?' text.file

produzirá apenas carimbos de data e hora. Por remover a opção -o , você receberá linhas completas

grep -E '[0-9.]{10},[0-9]{2}:[0-9]{2}(:[0-9]{2})?' text.file

Se o padrão [0-9.]{10} não produzir a saída correta, será fácil mudar para ([0-9]{2}\.){2}[0-9]{4} mais strong.
Se você quiser fazer as duas tarefas simultaneamente, isso pode ser feito por sed , por exemplo

sed -r '/[0-9.]{10},[0-9]{2}:[0-9]{2}(:[0-9]{2})?/w string.file
s/[^:]*([0-9.]{10},[0-9]{2}:[0-9]{2}(:[0-9]{2})?)/\n/;//P;D' text.file
    
por 29.07.2016 / 10:00