我有一些音乐文件,命名为“曲目名称[艺术家]”。
我希望它们是“[艺术家] 曲目名称”,因此需要将方括号及其中的内容移动到文件的开头。
我刚刚发现 sed,但不知道如何使用它来做我想做的事情。
答案1
使用 sed
有很多方法可以做到这一点。如果你想在学习的同时做到这一点sed
,那么请尝试:
$ filename='track name [artist].mp3'
$ newname=$(echo "$filename" | sed -E 's/(.*[^[:space:]])[[:space:]]*[[](.*)[]]/[\2] \1/')
$ echo "$newname"
[artist] track name.mp3
sed 替换命令的形式为,s/old/new/
其中old
是正则表达式。在本例中old
由以下部分组成:
(.*[^[:space:]])
捕获曲目名称。由于此正则表达式被括号包围,因此曲目名称被保存在一个组中。部分.*
匹配任何内容。匹配[^[:space:]]
任何非空格。通过放在[^[:space:]]
末尾,我们确保这会捕获曲目名称,但不捕获其后的空格。[[:space:]]*[[]
匹配轨道名称后面的空格(如果有)以及[
其后的 。由于[
是 sed-active 字符,因此我们必须以某种方式对其进行转义。在这里,我们将其放在方括号中以进行转义,如下所示[[]
。(.*)[]]
匹配文件名中最后一个字符的文本]
。此处的括号使艺术家姓名被捕获为第二组。
new
替换命令的部分是。[\2] \1
这会将第二组\2
(艺术家姓名)放在第一位,将第一组\1
(曲目名称)放在第二位。
重命名文件的快捷方式
如果您的目标是重命名文件,我建议使用rename
perl 包中的命令(有时称为prename
):
$ ls *mp3
track name [artist].mp3
$ prename 's/(.*[^[:space:]])[[:space:]]*[[](.*)[]]/[$2] $1/' *.mp3
$ ls *mp3
[artist] track name.mp3
prename
使用与 sed 非常相似的 perl 替换命令,但引用的捕获组不是和\1
,\2
而是$1
和$2
。
注意:有些 Linux 安装了一个不同的rename
实用程序,不相容并且不会像上面那样工作。