Se você tiver acesso ao GNU date
(o padrão nos sistemas Linux), você pode fazer:
$ sed -E 's/(.*)-([a-z]+)(.+)/-/i' file |
while read d; do date -d "$d" +%d/%m/%y; done
24/12/16
24/12/16
Isso altera linhas como 2016-Dec-24
a Dec-24-2016
(um formato que o GNU date
pode entender), deixa linhas como 2016-12-24
(um formato GNU date já entende) sozinho e passa cada linha como uma entrada data string para date
. Ele não faz isso no local e não usa sed -i
, mas é quase certamente a abordagem mais simples.
Se você realmente precisa fazer isso usando sed
, você pode fazer uma lista de todos os meses e números correspondentes:
$ for m in {1..12}; do printf '%s %s\n' "$m" $(date -d "$m/1/2016" +%b); done
1 Jan
2 Feb
3 Mar
4 Apr
5 May
6 Jun
7 Jul
8 Aug
9 Sep
10 Oct
11 Nov
12 Dec
Salvar como months
e, em seguida, iterar sobre ele para modificar seu arquivo:
while read num mon; do
sed -Ei "s/$mon/$num/; s#(.*)-(.*)-(.*)#//#" file
done < months
Ou, se a sua implementação sed precisar separar -e
:
while read num mon; do
sed -i -e "s/$mon/$num/" -Ee 's#(.*)-(.*)-(.*)#//#' file
done < months
A primeira substituição substituirá todos os nomes dos meses alfabéticos pelo número correspondente e a segunda move as coisas para obter o formato desejado.