2013-09-23 98 views
5

我有一个输入的日志文件,这种格式的桑达替代和外部命令

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 

但是如何让match_string在sed命令中被评估呢?

+0

您可能是想在'date'命令中说'5月23日...'而不是'5月23日...」。 – devnull

+0

我纠正了打字错误,对不起。 –

+0

是否需要外部命令?见http://sed.sf.net/grabbag/tutorials/lookup_tables.txt – potong

回答

8

如果你有GNU桑达可用,您可以使用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 
0

我会使用Perl为此:

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

Perl当然可以d o日期如何:

perl -MTime::Piece -lpe ' 
    $_ = Time::Piece->strptime($_, "%b %d %Y %T")->ymd if $. % 2 == 1 
' 
+0

问题是关于sed。我知道我们可以在awk,python中做类似的事情......这只取决于你已经知道的东西。 –

+0

不要忘记,答案不只是为了你。 –

+0

我知道这一点,但在此之前我搜索了类似的问题。所有的答案都是关于awk,perl等不同的可能性的。这就像在C++中提出问题并用Java获得答案一样。很混乱。 –