Primeiro, as aspas suprimem o significado dos caracteres especiais no regex ( manual online ):
An additional binary operator,
=~
, is available, ... Any part of the pattern may be quoted to force the quoted portion to be matched as a string. ... If you want to match a character that’s special to the regular expression grammar, it has to be quoted to remove its special meaning.
O manual continua recomendando colocar o regex em uma variável para evitar alguns conflitos entre a análise do shell e a sintaxe regex.
Em segundo lugar, \d
não faz o que você acha que faz, mas apenas corresponde a um literal d
.
Observe também que ${BASH_REMATCH[0]}
contém toda a string correspondente, e os índices 1
e up contêm os grupos capturados.
Eu também sugiro strongmente usar anos de quatro dígitos, então:
modified=$(stat -c %y "$file")
re='^([0-9]{4})-([0-9]{2})'
if [[ $modified =~ $re ]]; then
echo "year: ${BASH_REMATCH[1]}"
echo "month: ${BASH_REMATCH[2]}"
else
echo "invalid timestamp"
fi
Para um arquivo modificado hoje, isso dá year: 2018
e month: 08
. Observe que os números com um zero à esquerda serão considerados octal pelo shell e possivelmente por outros utilitários.
(Anos de quatro dígitos têm menos problemas se você precisar lidar com datas de 1900, e eles são mais fáceis de reconhecer como anos e não como dias do mês.)