2013-09-23 16 views
5

Mam plik dziennika wejściowego w tym formacieSed podstawienie i poleceń zewnętrznych

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

chciałbym wyprowadzać go w tym formacie

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

Korzystanie sed, wiem jak zastąpić datę linie

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

Korzystanie z date, wiem jak konwertować daty:

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

Ale w jaki sposób można dokonać porównania parametru match_string podczas komendy sed?

+0

Prawdopodobnie chciałeś powiedzieć "23 maja ..." zamiast "Maj 23 maja ..." w twoim poleceniu 'date'. – devnull

+0

Poprawiłem błędy w pisowni, przepraszam za to. –

+0

Czy konieczne jest zewnętrzne polecenie? zobacz http://sed.sf.net/grabbag/tutorials/lookup_tables.txt – potong

Odpowiedz

8

Jeśli masz GNU sed dostępny, można użyć e flag

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

pomogą wam za przykład zobaczyć 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

użyję Perl w tym celu:

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

Oczywiście Perl może o jaka data:

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

Pytanie dotyczyło sed. Wiem, że możemy robić podobne rzeczy w awk, python ... To zależy od tego, co już wiesz. –

+0

Nie zapominaj, że odpowiedzi nie są tylko dla Ciebie. –

+0

Wiem o tym, ale wcześniej szukałem podobnych pytań. A wszystkie odpowiedzi dotyczyły różnych możliwości w awk, perlu itp. To tak, jakby zadając pytanie w języku C++ i otrzymując odpowiedź w Javie. Bardzo mylące. –

Powiązane problemy