有人可以build议一个快速的oneliner转换20111214到2011.12.14在UNIX?

我认为这应该在sed / awk中可行,对吧? 将以下列表转换为2011.08.01 …等

20110801 20110802 20110803 20110804 20110805 20110808 

只是不够聪明,不知道如何去做

任何build议?

使用GNU日期:

  for date in 20110801 20110802 20110803 20110804 20110805 20110808; do date -d "$date" +%Y.%m.%d done 

它在无效的日期吧。

 date -d '20111214' +'%Y.%m.%d' 

输入字符串可以接近所有可以被识别为日期的东西。

 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 

这可能适合你:

  sed 's/../.&/3g' 

在sed:

 sed 's/\(....\)\(..\)\(..\)/\1.\2.\3/' 

正如potong在评论中指出的那样,实际上并不需要指定所有的三个组。 你可以改为使用

 sed 's/\(....\)\(..\)/\1.\2./' 

呆子

 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)}'