如何标记过去的日期?

如何标记过去的日期?

从答案中我更新了问题:

现在,它是:

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

这是输入:

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

这是当前的 perl 脚本(工作得很好!,只缺少几小时/分钟)

$ 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

现在,它产生以下输出:

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

我们的问题:我们如何标记过去的日期 - 小时:分钟! - 红色?当前的 Perl 解决方案需要更新,因为它没有将“2014-06-04 11:23”标记为红色,但它已经是过去的日期了!

附言: - 多个日期可以放在一行 - 有效
- 过去的日子标记为红色 - 有效
- 我尝试使用“datetime”而不是“ymd”(http://perldoc.perl.org/Time/Piece.html) - 但它不起作用,可能是因为 input.txt 中有“”而不是“\t”? - +只是一个注释,我已经知道如何标记明天:

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

答案1

另一个perl解决方案,使用Time::Piece像 @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

更新

如果一行中有多个过去的日期,请尝试:

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

解释

  • 我们将所有日期保存在数组的一行中@days
  • 对于每个日期,我们检查它是否小于今天,然后替换它。

答案2

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
    }'

基本上,ymd方法是时间::件以预期格式返回当前日期。然后,您可以使用纯字符串比较来获取过去的日期。

更新:要每行处理多个日期,您必须更改代码:

< 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;   
    }'

相关内容