Como remover alguns caracteres depois de uma partida?

1

Eu tenho um arquivo com o seguinte conteúdo de amostra:

NOF DOWN BITS = 96 data = Wed Jan 3 04:37:32 2018:7E Wed Jan 3 04:37:32 2018:7E Wed Jan 3 04:37:32 2018:7E Wed Jan 3 04:37:32 2018:7E Wed Jan 3 04:37:32 2018:7E Wed Jan 3 04:37:32 2018:7E Wed Jan 3 04:37:32 2018:7E Wed Jan 3 04:37:32 2018:7E Wed Jan 3 04:37:32 2018:7E Wed Jan 3 04:37:32 2018:7E Wed Jan 3 04:37:32 2018:7E Wed Jan 3 04:37:32 2018:7E Wed Jan 3 04:37:32 2018:
nof_received_data_packets

Gostaria de excluir a data e a hora do arquivo. Ou seja, desejo remover todas as ocorrências de "Qua 3 de janeiro XX: XX: XX 2018:". Portanto, possivelmente remova n caracteres após cada ocorrência de Wed .

Como eu conseguiria isso com sed ?

    
por Prabhu 03.01.2018 / 11:15

2 respostas

1

Com o awk :

awk -v RS='[[:alpha:]]{3} [[:alpha:]]{3} [0-9]{1,2} ([0-9]{2}:?){3} [0-9]{4}:' \
    -v ORS='' '{print}'  datafile

NOF DOWN BITS = 96 data = 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 
nof_received_data_packets

Isso funciona configurando o Record Separator (RS) como uma expressão regular que corresponda a strings que se parecem com uma data & tempo seguido por um : e definindo o ORS (Output Record Separator) para esvaziar.

Em seguida, apenas imprime cada "registro".

Funciona com qualquer data & tempo, supondo que apenas os nomes curtos do Mês e os nomes curtos do Dia tenham sempre três letras, e que o formato da data seja sempre Day Month Daynum HH:MM:SS YYYY .

com sed :

sed -E 's/[[:alpha:]]{3} [[:alpha:]]{3} [0-9]{1,2} ([0-9]{2}:?){3} [0-9]{4}://g' \
  datafile

Isso usa a mesma regex de correspondência de data para remover tudo o que parece uma data & tempo seguido por : .

Com perl :

perl -p -e 's/\w{3} \w{3} \d{1,2} (\d{2}:?){3} \d{4}://g' datafile

expressões regulares perl possuem alguns atalhos para especificar caracteres "word" ( \w ) e dígitos ( \d ). A versão perl é compatível com unicode e deve funcionar em qualquer localidade.

Todos os três são scripts de força bruta. Não creio que valha a pena tentar algo mais sofisticado do que isso, a menos que o formato de data provavelmente variasse do acima. Se esse fosse o caso, eu provavelmente escreveria algo em perl para escanear substrings de cada linha usando o módulo Date::Parse .

As versões sed e awk requerem o GNU sed e o GNU awk , ou pelo menos versões deles que entendem as contagens de repetição de expressões regulares {n,m} .

    
por 04.01.2018 / 02:18
2

Apenas combine o padrão:

$ sed 's/Wed Jan 3 ..:..:.. 2018://g' FILE
NOF DOWN BITS = 96 data = 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 
nof_received_data_packets

Existem provavelmente maneiras mais sofisticadas de escrever isso, mas isso funciona.

    
por 03.01.2018 / 11:20