Como marcar datas que estão no passado?

1

Nas respostas, atualizei a pergunta:

Agora, é:

$ date "+%F %H:%M"
2014-06-04 11:26

Esta é a entrada:

$ cat input.txt 
<tr><td>2014-04-24 14:01</td><td>2014-06-04 11:30</td><td>2014-06-04 11:23</td></tr>

Este é o script perl atual (que está funcionando EXCELENTE !, faltando apenas horas / minutos)

$ cat a.txt 
perl -MTime::Piece -pe '
    BEGIN {$today = localtime->ymd}
    @days = $_ =~ /<td>(.+?)<\/td>/g;
    for $d (@days) {
      $_ =~ s!$d!<font style=BACKGROUND-COLOR:red>$d</font>!g if $d lt $today;
      }' input.txt

E agora, produz esta saída:

$ bash a.txt 
<tr><td><font style=BACKGROUND-COLOR:red>2014-04-24 14:01</font></td><td>2014-06-04 11:30</td><td>2014-06-04 11:23</td></tr>

Nossa pergunta : Como podemos marcar as datas anteriores? as horas: minutos também! - como vermelho? A solução perl atual precisa ser atualizada, pois não marca o "2014-06-04 11:23" em vermelho, mas é uma data passada!

p .: - várias datas podem estar em uma linha - isso está funcionando dias passados marcados como vermelhos, que está funcionando. - Eu tentei usar o "datetime" em vez de "ymd" ( link ) - mas não funcionou , provavelmente por causa disso no input.txt existem "" em vez de "\ t"? - + apenas uma nota, eu já descobri como marcar amanhã:

sed -i "s/<td>\('date +%F -d '+1 day''\)/<td><font style=BACKGROUND-COLOR:lightgreen><\/font>/g" in.txt
    
por evachristine 09.05.2014 / 17:09

2 respostas

3

Outra solução perl usa o módulo Time::Piece como a resposta da @ choroba:

$ perl -MTime::Piece -pe '
BEGIN {$today = localtime->ymd." ".localtime->hms}
    s!($1)!<font style=BACKGROUND-COLOR:red>$1</font>!g
    if /<td>(.+?)<\/td>/g and $1 lt $today;
' in.txt
asfsaf<td><font style=BACKGROUND-COLOR:red></font> kjycasfd
FKZF<td>2014-05-09 lkjafsa
sdfg<td>2014-05-13 asdf
sfjlaslfsaljf <td><font style=BACKGROUND-COLOR:red></font> DIJIZLOF

Atualizar

Se você tiver várias datas anteriores em uma linha, tente:

$ perl -MTime::Piece -pe '
    BEGIN {$today = localtime->ymd." ".localtime->hms}
        @days = $_ =~ /<td>(.+?)<\/td>/g;
        for $d (@days) {
          $_ =~ s!$d!<font style=BACKGROUND-COLOR:red>$d</font>! if $d lt $today;
      }' in.txt
<tr><td><font style=BACKGROUND-COLOR:red>2014-04-24 00:01</font></td><td>2014-06-24 00:01</td><td><font style=BACKGROUND-COLOR:red>2014-05-13 00:00</font></td></tr>

Explicação

  • Salvamos todas as datas em uma linha na matriz @days .
  • Para cada data, verificamos se ela é menor que a de hoje e substituí-la.
por 09.05.2014 / 17:50
1

Solução de Perl:

< in.txt perl -MTime::Piece -pe '
    BEGIN { $t = localtime->ymd }
    if (/([0-9]{4}-[0-9]{2}-[0-9]{2})/ and $1 lt $t) {
        s=($1)=<red>$1</red>=g
    }'

Basicamente, o método ymd de Time :: Piece retorna a data atual no formato esperado. Você pode então usar a comparação de string simples para obter datas passadas.

UPDATE : Para processar várias datas por linha, você precisa alterar o código:

< in.txt perl -MTime::Piece -pe '
    BEGIN { $t = localtime->ymd }
    push @d, $1 while /([0-9]{4}-[0-9]{2}-[0-9]{2})/g;
    for my $d (@d) {
        $d lt $t and s=($d)=<red>$1</red>=g;   
    }'
    
por 09.05.2014 / 17:21