我希望将 txt 文件中的此类条目 26/04/2008 转换为 2008 年 4 月
注意:这没有使用日期命令,这些是文件中的日期条目
我可以用 sed 做到这一点吗?
这是使用管道等的单行脚本的一部分
答案1
不,它不起作用(只是)sed
因为您必须在过程中解析日期。
您可以使用命令的组合来完成此操作date
,或者我个人会选择perl
- 您可以像使用它一样使用它sed
,但它也具有Time::Piece
执行日期解析的模块。
可运行示例:
#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;
while ( <DATA> ) {
chomp;
print Time::Piece->strptime($_, "%d/%m/%Y")->strftime("%B %Y"),"\n";
}
__DATA__
26/04/2008
26/05/2008
26/07/2009
您可以将其“一个衬垫”用于管道中(或者您可以指定要在最后作为参数处理的文件):
perl -MTime::Piece -nle 'print Time::Piece->strptime($_, "%d/%m/%Y")->strftime("%B %Y");'
注意 - 这两者都假设日期只是每行一个。如果需要的话,将其提取为子字符串并不是特别困难,并且可以有效地将其“sed”为子字符串模式。
#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;
while ( <DATA> ) {
s|(\d{2}/\d{2}/\d{4})|Time::Piece->strptime($1, "%d/%m/%Y")->strftime("%B %Y")|e;
print;
}
__DATA__
26/04/2008 and some text here
a line like this with a date of 26/05/2008
26/07/2009 and some more here maybe
将把它变成:
April 2008 and some text here
a line like this with a date of May 2008
July 2009 and some more here maybe
再次,单行化为:
perl -MTime::Piece -pe 's|(\d{2}/\d{2}/\d{4})|Time::Piece->strptime($1, "%d/%m/%Y")->strftime("%B %Y")|e;'