¿Cómo marcar fechas que están en el pasado?

¿Cómo marcar fechas que están en el pasado?

A partir de las respuestas actualicé la pregunta:

Ahora es:

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

Esta es la 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 es el script Perl actual (¡está funcionando EXCELENTE!, solo faltan 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

Y ahora produce este resultado:

$ 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>

nuestra pregunta: ¿Cómo podemos marcar las fechas pasadas? ¡Las horas: minutos también! - ¿Tan rojo? La solución Perl actual debe actualizarse ya que no marca el color rojo "2014-06-04 11:23", ¡pero es una fecha pasada!

PD: - varias fechas pueden estar en una línea - eso está funcionando
- los días pasados ​​están marcados en rojo - eso está funcionando
- Intenté usar "fecha y hora" en lugar de "ymd" (http://perldoc.perl.org/Time/Pieza.html) - pero no funcionó, probablemente debido a que en el input.txt hay " " en lugar de "\t". - +solo una nota, ya descubrí cómo marcar mañana:

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

Respuesta1

Otra perlsolución, use Time::Pieceun módulo como la respuesta de @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

Actualizar

Si tiene varias fechas pasadas en una línea, intente:

$ 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>

Explicación

  • Guardamos todas las fechas en una línea en una @daysmatriz.
  • Para cada fecha, verificamos si es menor que hoy y luego la reemplazamos.

Respuesta2

Solución 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
    }'

Básicamente, el ymdmétodo deRelojdevuelve la fecha actual en el formato esperado. Luego puede utilizar la comparación de cadenas simples para obtener fechas pasadas.

ACTUALIZAR: Para procesar varias fechas por línea, debe cambiar el 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;   
    }'

información relacionada