6

我有一个这种格式的输入日志文件

May 23 2012 11:59:56
a;b;c
May 21 2012 16:54:12
d;e;f
May 19 2012 16:22:52
g;h;i
...

我想以这种格式输出它

2012-05-23
a;b;c
2012-05-21
d;e;f
2012-05-19
g;h;i
...

使用sed,我知道如何替换日期线

% sed 's/.*:.*:.*/match_string/' input.txt
match_string
a;b;c
match_string
d;e;f
match_string
g;h;i
...

使用date,我知道如何转换日期:

% date -d 'May 23 2012 11:59:56' '+%Y-%m-%d'
2012-05-23

但是如何在 sed 命令期间评估 match_string 呢?

4

2 回答 2

10

如果您有可用的GNU Sed,则可以使用以下e标志:

sed 's/.*:.*/date -d"&" "+%Y-%m-%d"/ge' file

将为您的示例提供帮助,请参阅测试:

kent$  echo "May 23 2012 11:59:56
a;b;c
May 21 2012 16:54:12
d;e;f
May 19 2012 16:22:52
g;h;i"|sed 's/.*:.*/date -d"&" "+%Y-%m-%d"/ge'
2012-05-23
a;b;c
2012-05-21
d;e;f
2012-05-19
g;h;i
于 2013-09-23T11:41:43.743 回答
0

我会为此使用 Perl:

perl -pe '$_ = qx{ date -d "$_" +%F } if $. % 2 == 1'

当然 Perl 可以做 date 所做的事情:

perl -MTime::Piece -lpe '
    $_ = Time::Piece->strptime($_, "%b %d %Y %T")->ymd if $. % 2 == 1
'
于 2013-09-23T12:36:06.470 回答