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

Using sed to fix format of date string

题目具体涉及到修改一个字符串形式

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-_0/'

不过,我想知道是否有更好、更简洁的替代方案。此外,使用 TRE(标记正则表达式)是 sed 完成此类任务的唯一方法吗?谢谢!

编辑:抱歉,澄清一下,原始字符串的格式可以是 "abc_MM-DD-YY_XX.jpg" 或 "abc_MM-DD-YY_XXX.jpg",但输出格式必须是 "abc_MM-DD-YY_XXX.jpg"。因此,在第一种情况下,我想用 0 填充 "XX",而在第二种情况下,我想保留它。我也意识到我的表达不适用于第二种情况...

这只适用于世纪!

使用awk

我会为此使用 awk。使用起来更简单:

awk -F'[-_]' '[=10=]="xyz_20""-""-""_"sprintf("%03d",)' <<<'abc_03-24-15_11.jpg'

会给你:

xyz_2015-03-24_011.jpg

同时:

awk -F'[-_]' '[=12=]="xyz_20""-""-""_"sprintf("%03d",)' <<<'abc_03-24-15_111.jpg'

会给你:

xyz_2015-03-24_111.jpg

你想要的应该是什么。

解释:

我使用 -_ 作为字段分隔符并简单地重新组织字段。为了将 XX 值填充到 XXX,我使用 sprintf()。 (感谢


使用sed

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

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

(这并不完美,因为它目前不能正确解决 XXXXX 的问题。给我一分钟...)

要解决这个问题,您可以简单地附加另一个 s 命令:

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

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

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

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