я думаю, что это должно быть выполнимо в sed / awk, верно? преобразовать следующий список в 2011.08.01 ... и т. д.
20110801 20110802 20110803 20110804 20110805 20110808
просто не достаточно умен, чтобы понять, как это сделать
какие-либо предложения?
date -d '20111214' +'%Y.%m.%d'
Строка ввода может быть близка ко всему, что может быть идентифицировано как дата.
Использование даты GNU:
for date in 20110801 20110802 20110803 20110804 20110805 20110808; do date -d "$date" +%Y.%m.%d done
Это неверная дата.
Это может работать для вас:
sed 's/../.&/3g'
В седе:
sed 's/\(....\)\(..\)\(..\)/\1.\2.\3/'
Как отметил potong в комментарии, на самом деле нет необходимости указывать все три группы. Вместо этого вы можете использовать
sed 's/\(....\)\(..\)/\1.\2./'
export V=20111010;echo ${V:0:4}.${V:4:2}.${V:6:2}
Так что для вашего случая, что-то вроде:
while read x; do echo ${x:0:4}.${x:4:2}.${x:6:2}; done
простак
gawk '/^[0-9]+$/{print substr($0,1,4)"."substr($0,5,2)"."substr($0,7,2)}' input.txt
Для awk, почему substr, когда у вас есть printf ??
awk 'NF{printf("%.4s.%.2d.%.2d\n", $1, $1%10000/100, $1%100)}'