当我试图修复电视连续剧的剧集编号时,我戏弄了重命名功能,并试图将printf的返回值作为重命名参数传递,但无法做到。我尝试了几乎所有的组合
for j in $(seq 1 9);
do
rename 's/"$( - "`printf "%d" ${j}`" - )"/"$( - "`printf "0%d" ${j}`" - )"/g' *
done
我能想到的,但似乎没有任何效果。我最终只是手动完成,因为在这种情况下,我只关心1-9,所以
rename 's/- 1 -/- 01 -/g' *
rename 's/- 2 -/- 02 -/g' *
...
有人可以指出为什么以上这些方法不起作用以备将来参考吗?
您单引号引用了整个表达式,因此不会进行外壳插值,并且Perl将看到最奇怪的正则表达式"$( - "
printf“%d” $ {j} " - )"
,该表达式由Perl插值成类似
% perl -E 'say qq{"$( - "`printf "%d" ${j}`" - )"}'
"42 640 - "`printf "%d" `" - )"
%
因为您要求Perl内插$(
您可以通过阅读的变量perldoc -v '$('
。可以说,此正则表达式可能与您的文件不匹配。(并且演示了尝试将多种语言嵌入到一个非常复杂的字符串中的几种陷阱之一;实际上,Perl可以做到这一点完全没有必要。)
更好的方法是匹配并调整您感兴趣的内容,这里似乎是连字符所包围的数字;假设文件名中仅存在一个数字,则只需在保存后向引用的那个数字上进行匹配,([0-9]+)
然后使用Perlsprintf
函数适当地填充这些数字(加上重要/e
标志,将右侧视为sprintf
实际上被调用的表达式)。
% touch "blah - "{1..9}" - blah"
% ls
blah - 1 - blah blah - 3 - blah blah - 5 - blah blah - 7 - blah blah - 9 - blah
blah - 2 - blah blah - 4 - blah blah - 6 - blah blah - 8 - blah
% rename 's/([0-9]+)/sprintf "%02d", $1/e' *
% ls
blah - 01 - blah blah - 04 - blah blah - 07 - blah
blah - 02 - blah blah - 05 - blah blah - 08 - blah
blah - 03 - blah blah - 06 - blah blah - 09 - blah
%
如果文件名中的其他地方有数字,请为此输入正则表达式,例如
% rename 's/- ([0-9]+) -/sprintf "- %d -", $1/e' *
% ls
blah - 1 - blah blah - 3 - blah blah - 5 - blah blah - 7 - blah blah - 9 - blah
blah - 2 - blah blah - 4 - blah blah - 6 - blah blah - 8 - blah
%
要rename
最有效地使用正则表达式,请参见
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句