问题特别涉及修改表格
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和第二种情况下,我想留下它。我也意识到我的表达对第二种情况不起作用......
答案 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'
(由于目前无法正确解决XX
至XXX
问题,因此无法正常工作。请给我一分钟......)
要解决此问题,您只需附加另一个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)看起来不简单