Pessoalmente, eu faria assim:
- analise a hora no formato de época.
- imprima a hora da época no formato de saída desejado.
Por exemplo assim:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
use Time::Piece;
while ( <DATA> ) {
my ( $time_str ) = m/^([\d\:]+ [AP]M)/;
print $time_str, "=>",;
my $newtime = Time::Piece -> strptime ( $time_str, "%I:%M:%S %p" );
print $newtime->strftime("%H:%M:%S"),"\n";
}
__DATA__
12:00:01 AM CPU %usr %nice %sys %iowait %steal %irq %soft %guest %idle
12:10:01 AM all 0.01 0.00 0.07 0.00 0.00 0.00 0.00 0.00 99.93
12:10:01 AM 0 0.01 0.00 0.02 0.00 0.00 0.00 0.00 0.00 99.97
Qual seria o seu script:
#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;
while (<>) {
if ( my ($time_str) = m/^([\d\:]+ [AP]M)/ ) {
my $new_time_str = Time::Piece->strptime( $time_str, "%I:%M:%S %p" )
->strftime("%H:%M:%S");
s/$time_str/$new_time_str/;
}
print;
}
Isso funciona "inline" - <>
é a mágica do perl para permitir que você:
-
./myscript.pl some_file
-
some_command | ./myscript.pl
Provavelmente, pode-se linerificar isso como:
perl -MTime::Piece -pe 's/^([\d\:]+ [AP]M)/Time::Piece->strptime( $1, q{%I:%M:%S %p} )->strftime(q{%H:%M:%S})/e;'