使用 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'
(这并不完美,因为它目前不能正确解决 XX
到 XXX
的问题。给我一分钟...)
要解决这个问题,您可以简单地附加另一个 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)
题目具体涉及到修改一个字符串形式
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'
(这并不完美,因为它目前不能正确解决 XX
到 XXX
的问题。给我一分钟...)
要解决这个问题,您可以简单地附加另一个 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)