과거의 날짜를 어떻게 표시하나요?

과거의 날짜를 어떻게 표시하나요?

답변에서 질문을 업데이트했습니다.

지금이야:

$ 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"을 빨간색으로 표시하지 않지만 이미 과거 날짜이기 때문에 업데이트가 필요합니다!

추신: - 여러 날짜를 한 줄에 입력할 수 있습니다. - 작동
- 지난 날은 빨간색으로 표시됩니다. - 작동
- "ymd" 대신 "datetime"을 사용해 보았습니다(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

펄 솔루션:

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

관련 정보