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
dcomo-mm-dd, como emtoday. -
Se
dfor lexicamente maior quetoday, por exemplo, no nosso exemplo acima-12-27é maior que-01-02, então definimosdpara 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 GNUdatesignifique imprimir em%Fformat (ou seja,YYYY-MM-DD) a data especificada por2016-12-27 +10 days, ou seja, 10 dias após 2016-12-27.