Validação de tempo com regex

Validação de tempo com regex

Gostaria de fazer a validação do carimbo de data/hora de um dos meus arquivos de log. Mas parece que tenho problemas na minha expressão na declaração de caso.

O valor de TIME pode ser algo como 11:49 ou 2011. E eu só quero verificar se está no formato HH:MM ou não. O código está abaixo.
Está sempre dizendo o formato do ano, embora o arquivo esteja no formato HH:MM

#!/usr/bin/ksh
TIME=`ls -lrth  /var/log/*.log |  grep -i upg | tail -1 | awk '{print $8}'`
echo "$TIME"
validation=false
if [[ $TIME != "" ]]
 then
  case TIME in
     "[0-23]+ :[0-59]")
        validation=true
        break;;
  *) echo "Year format";;
esac
fi

echo "$validation

Atualização: tentei "[0-2][0-9]:[0-5][0-9]") mas a validação ainda falha no retorno.

Responder1

O problema é que você não pode verificar TIME com [0-23]+ :[0-59]expressão.

Há várias maneiras de fazer isso:

  • Para dividir sua variável e verificar cada parte separadamente:
TIME="06:25" ; 
[[ $TIME != "" ]] && \
[ ${TIME%:*} -le 23 -a ${TIME%:*} -ge 0 -a \
        ${TIME#*:} -le 59 -a ${TIME#*:} -ge 0 ] && echo ok
  • Para verificar com regex comum, mas aceitará alguns casos de horário errado (como 28:59):
"[0-2][0-9]:[0-5][0-9]")

informação relacionada