2013-09-23 23 views
5

Ho un file di registro di input in questo formatoSed sostituzione e comando esterno

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 
... 

vorrei uscita in questo formato

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

Utilizzando sed, so come sostituire la data linee

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

Uso date, so come convertire le date:

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

Ma come si può valutare la corrispondenza_stringa durante il comando sed?

+0

Probabilmente intendevi dire "23 maggio ..." invece di "Maggio 23 maggio ..." nel tuo comando "date". – devnull

+0

Ho corretto gli errori di battitura, mi dispiace per quello. –

+0

È necessario un comando esterno? vedi http://sed.sf.net/grabbag/tutorials/lookup_tables.txt – potong

risposta

8

Se hai GNU Sed disponibili, è possibile utilizzare il flag e:

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

vi aiuterà per il tuo esempio, vedere il test:

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

userei Perl per questo:

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

Naturalmente Perl può d o che data fa:

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

La domanda era su sed. So che possiamo fare cose simili in awk, python ... Dipende solo da ciò che già sai. –

+0

Non dimenticare che le risposte non sono solo per te. –

+0

Lo so, ma prima ho cercato domande simili. E tutte le risposte riguardavano le diverse possibilità in awk, perl ecc. È come chiedere una domanda in C++ e ottenere una risposta in Java. Molto confuso. –