使用sed来修复日期字符串的格式

时间:2015-03-25 00:21:37

标签: regex bash sed

问题特别涉及修改表格

abc_MM-DD-YY_XX.jpg

(其中XX可以由两位或三位数组成)

xyz_YYYY-MM-DD_XXX.jpg

我能够这样做:

sed 's/\(.*_\)\(.\{5\}\)-\([0-9][0-9]\)_\([0-9][0-9]\.\)/xyz_20\3-\2_0\4/'
但是,我想知道,如果有更好的,也许更简洁的替代方案。另外,使用TRE(标记的正则表达式)sed可以完成这样的任务的唯一方法是什么?谢谢!

编辑:对不起,澄清一下,原始字符串的格式可以是" abc_MM-DD-YY_XX.jpg"或" abc_MM-DD-YY_XXX.jpg",但输出格式必须为" abc_MM-DD-YY_XXX.jpg"。所以在第一种情况下,我想填补" XX"在0和第二种情况下,我想留下它。我也意识到我的表达对第二种情况不起作用......

1 个答案:

答案 0 :(得分:3)

这只会在本世纪发挥作用!

使用awk

我会使用awk。它更简单:

awk -F'[-_]' '$0="xyz_20"$4"-"$2"-"$3"_"sprintf("%03d",$5)' <<<'abc_03-24-15_11.jpg'

会给你:

xyz_2015-03-24_011.jpg

,同时:

awk -F'[-_]' '$0="xyz_20"$4"-"$2"-"$3"_"sprintf("%03d",$5)' <<<'abc_03-24-15_111.jpg'

会给你:

xyz_2015-03-24_111.jpg

你应该想要什么。

说明:

我使用-_作为字段分隔符,只需重新组织字段即可。要使用XX实现XXX {和{{}}值的填充sprintf()。 (谢谢Amadan


使用sed

顺便说一句,如果您使用sed选项并且只是匹配未出现字符的序列,则可以大量简化-r命令:

sed -r 's/([^_]+)_([^-]+)-([^-]+)-([^_]+)_([^.]+)/xyz_20\4-\2-\3_0\5/;' <<<'abc_03-24-15_12.jpg'

(由于目前无法正确解决XXXXX问题,因此无法正常工作。请给我一分钟......)

要解决此问题,您只需附加另一个s命令:

s/0([0-9]{3})\./\1./

0123替换序列123。最终命令如下所示:

sed -r 's/([^_]+)_([^-]+)-([^-]+)-([^_]+)_([^.]+)/xyz_20\4-\2-\3_0\5/;s/0([0-9]{3})\./\1./' <<<'abc_03-24-15_12.jpg'

使用-r;)(hihi)看起来不简单