将日期“ 2011年7月29日”更改为“ 20110729”


8

我有很多HTML文件包含格式的日期 July 29th, 2011

我想改变日期格式July 29th, 201120110729December 9th, 201020101209,等等。

我认为sed可能可行,但由于其间接顺序,仍然找不到解决方案。


您最好使用perl,它可以读取一种日期格式并输出另一种日期格式,但是我的perl-foo不够好,希望其他人能参与其中
。– SevenBitTony

Answers:


7

这种事情比大多数工具要困难得多。GNU awk和Perl的POSIX模块都为您提供了strftime(),但没有给您提供strptime(),这正是您想要的。

无论如何,使用Perl还是很容易的...

$ perl -MDate::Manip -lpe '$_=UnixDate(ParseDate($_), "%Y%m%d")' <<END
> July 29th, 2011
> December 9th, 2010
> END
20110729
20101209

显然还有更多内容,因为您实际上要转换HTML。如果您可以找到带有sed的正则表达式来查找日期字符串,那么您应该能够使用Perl做一些非常相似的事情。

$ perl -MDate::Manip -lpe 's/(")([^"]+)(")/$1 . UnixDate(ParseDate($2), "%Y%m%d") . $3/ge' <<END
dates enclosed "July 29th, 2011" in quotes
"December 9th, 2010"
END
dates enclosed "20110729" in quotes
"20101209"

在哪里/如何获得该Date::Manip模块?...我的perl给我一个错误,“无法在@INC中找到Date / Manip.pm ...”。它是一个额外的模块,我需要以某种安装?...我正在使用perl,v5.10.1
Peter.O 2011年

@fred:大多数发行版程序包管理器都将具有此功能,请尝试在此处搜索。在我的系统上,软件包名称为,perl-Date-Manip但您的名称将有所不同。您也可以使用cpan
Caleb

@StevenPritchard:您编写了很好且有用的答案,很高兴在这个社区见到您。我只想指出,这个社区要依靠投票才能保持运转。投票不仅有助于对答案进行排序,还可以通过更改可见位置,搜索结果来塑造网站,最重要的是,可以帮助保持良好的用户来监视网站。没有选票就死了。您总共只投了3票。每天给您30个使用权!请考虑对您认为有价值的事物进行投票,从而利用您的知识来改进本网站。
卡莱布

@Caleb:谢谢。它在Ubuntu的存储库中为libdate-manip-perl.... @Steven Pritchard:这是一个很好的解决方案,谢谢。
Peter.O 2011年

1
GNU date确实具有解析和打印功能,但July 29th, 2011不是公认的格式(July 29, 2011有效),并且您需要在其中放置大量的shell和sed / awk基础结构。
吉尔斯(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.