尝试在 Perl 重命名工具 (Debian) 中进行算术运算

syn*_*ror 9 debian perl rename arithmetic

假设我有五个 mp3 文件:

01-trackfoo.mp3
02-trackbar.mp3
03-trackbaz.mp3
04-trackabc.mp3
05-trackxyz.mp3
Run Code Online (Sandbox Code Playgroud)

现在我快速收听文件(只有控制台上的 mplayer 可以解决问题),我发现曲目顺序错误。05实际上是02,其余的必须重命名。所以首先我会做一个临时重命名:

01-trackfoo.mp3

02-trackbar.mp3
03-trackbaz.mp3
04-trackabc.mp3
00-trackxyz.mp3
Run Code Online (Sandbox Code Playgroud)

现在我们需要一个“转变”:02 应该变成 03,03 应该变成 04,04 应该变成 05。为了尽量减少混淆,ex-05(现在是 00)稍后会被mv编辑。

我的方法是这样的:(perl rename,Larry Wall,Debian 上的默认设置)

rename 's/0([2-4])([\s\S]+)/0($1+1)$2/' *
Run Code Online (Sandbox Code Playgroud)

以及(稍后,经过一些更多的 RTFM'ing)

rename 's/0([2-4])([\s\S]+)/0($1+1)$2/e' *
Run Code Online (Sandbox Code Playgroud)

它们都/e[val]不起作用,特别是因为修饰符除了评估之外不接受任何其他内容,并且一旦您尝试将评估与字符串结合起来就会抛出错误。该bash能做到这一点就好了,例如, foo$((1+6))将被评估到foo7

那么我该怎么做(首选单行,不打算为此编写一个完整的独立脚本)?

Ala*_*rry 8

你几乎拥有它。您只需要在/e-modified 替换中使用引号和点运算符使文字字符串和字符串连接显式。

rename 's/0([2-4])([\s\S]+)/"0".($1+1).$2/e' *
Run Code Online (Sandbox Code Playgroud)