2013-09-23 2 views
5

У меня есть файл журнала ввода в этом формате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 
... 

Использование 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

Возможно, вы хотели сказать «23 мая ...» вместо 'май 23 мая ...' в вашей команде «date». – devnull

+0

Я исправил печатные ошибки, извините за это. –

+0

Необходима ли внешняя команда? см. http://sed.sf.net/grabbag/tutorials/lookup_tables.txt – potong

ответ

8

Если у вас есть 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 
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. Очень смущает. –

Смежные вопросы