我有一个这种格式的输入日志文件
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?
答案 0 :(得分: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
答案 1 :(得分:0)
我会使用Perl:
perl -pe '$_ = qx{ date -d "$_" +%F } if $. % 2 == 1'
当然Perl可以做日期:
perl -MTime::Piece -lpe '
$_ = Time::Piece->strptime($_, "%b %d %Y %T")->ymd if $. % 2 == 1
'