Bash Sed替换和外部命令

Bash Sed替换和外部命令,bash,sed,Bash,Sed,我有一个这种格式的输入日志文件 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 ... 我想以这种格式输出它 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

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

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
...
我想以这种格式输出它

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 -d 'May 23 2012 11:59:56' '+%Y-%m-%d'
2012-05-23

但是如何在sed命令期间评估匹配字符串?

如果您有可用的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
我将使用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
'

您的
date
命令中可能是说
May 23…
而不是
May 23…
。我更正了键入错误,很抱歉。是否需要外部命令?看,日期转换不是一件容易的事,我不想重新发明轮子。问题是关于sed的。我知道我们可以用awk和python做类似的事情。。。这取决于你已经知道了什么。别忘了答案不仅仅是给你的。我知道这一点,但在那之前我搜索过类似的问题。所有的答案都是关于AWK、Perl等不同的可能性,就像在C++中提问和在java中得到答案一样。非常混乱。