我的目标是通过迭代每个文件名并使用sed根据字符执行替换,将“img_MM-DD-YY_XX.jpg”形式的文件文件夹重命名为“newyears_YYYY-MM-DD_XXX.jpg”形式位置。不幸的是,我似乎无法让基于位置的互换工作。
e.g。 s/.\{4\}[0-9][0-9]/.\{10\}[0-9][0-9]/
尝试用YY替换MM
这是我的尝试(暂时忽略了_XX部分):
for filename in images/*
do
newname=$(echo $filename | sed 's/.\{4\}[0-9][0-9]/.\{10\}[0-9][0-9]/;
s/.\{7\}[0-9][0-9]/.\{4\}[0-9][0-9]/;
s/.\{10\}[0-9][0-9]/.\{7\}[0-9][0-9]/;
s/img_/newyears_20/')
mv $filename $newname
done
我有什么想法可以解决这个问题吗?
答案 0 :(得分:0)
$ echo 'img_11-22-14_XX.jpg' | sed -r 's/[^_]*_([0-9]{2})-([0-9]{2})-([0-9]{2})/newyears_20\3-\1-\2/'
newyears_2014-11-22_XX.jpg
以上查找包括第一个下划线后跟6位数日期的任何内容。它用newyears_
替换初始部分,并将日期从mm-dd-yy重新格式化为20yy-mm-dd。
两位数的mm,dd或yy值与([0-9]{2})
匹配。括号表示sed
应捕获该值以供以后使用。替换的输出端是_20\3-\1-\2
。这将恢复下划线并在年度前面添加20
。这一年是第三个被捕获的值,因此它被表示为\3
。同样,月份是第一个捕获的值,因此它表示为\1
,而第二天则表示为\2
。
为了消除一些黑色斜杠,我使用-r
选项来调用扩展的正则表达式。如果您使用的是Mac或其他非GNU系统,请使用sed -E
代替sed -r
。否则,请使用:
sed 's/[^_]*_\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/newyears_20\3-\1-\2/'
答案 1 :(得分:0)
这与awk
echo "img_MM-DD-YY_XX.jpg" | awk -F"[_-]" '{print "newyears_20"$4"-"$2"-"$3"_0"$5}'
newyears_20YY-MM-DD_0XX.jpg