Com o GNU sed
e o GNU date
:
sed -En 's#^Password=.*@([0-9]{2})([0-9]){2}$#date -d "/ +10 days" +%F#ep'
Nós transformamos o 2507 para 25/07 como GNU date
espera datas no estilo americano. No entanto, observe que 25/07 é entendido como 25 de julho do ano atual .
O que isso significa é que, se você executar esse comando em 2017-01-02 em uma entrada Password=x@2712
, receberá uma saída 2018-01-06
(10 dias após o 27 de dezembro 2017 ).
O que você poderia fazer é:
eval "$(date +'d=%d m=%m y=%Y')"
awk -v "y=$y" -v "today=-$m-$d" -F @ '
/^Password=.*@[0-9]{4}$/ {
d = "-" substr($NF, 3) "-" substr($NF, 1, 2)
d = (d > today ? y - 1 : y) d
system("date -d \"" d " +10 days\" +%F");
}'
Em eval "$(date +'d=%d m=%m y=%Y')"
, obtemos a data para a saída da data atual no formato d=25 m=07 y=2016
. Nós tomamos isso e o avaliamos como código de shell para definir as variáveis $d
, $m
e $y
shell. É melhor do que fazer d=$(date +%d) m=$(date +%m) y=$(date +%Y)
, pois ele executa somente um comando date
e evita o problema quando esse comando é executado em 23: 59: 59.9 no último dia do mês.
Em seguida, executamos awk
, com a variável y
awk definida para o conteúdo da variável $y
shell ( 2017
) e today
definido como -01-02
.
Em awk
, se o registro atual corresponder à expressão regular ^Password=.*@[0-9]{4}$
. Isto é, se começar com Password=
e terminar em @
, seguido de 4 dígitos decimais, então:
-
Extraia a data dos últimos 4 dígitos e armazene-a na variável
d
como-mm-dd
, como emtoday
. -
Se
d
for lexicamente maior quetoday
, por exemplo, no nosso exemplo acima-12-27
é maior que-01-02
, então definimosd
para o ano anterior (2016-12-27
), e para o ano atual caso contrário. -
Em seguida, executamos o comando
date -d "2016-12-27 +10 days" +%F
. Supondo que o GNUdate
signifique imprimir em%F
format (ou seja,YYYY-MM-DD
) a data especificada por2016-12-27 +10 days
, ou seja, 10 dias após 2016-12-27.