使用 id3v2 和 sed 编写 id3 标签

Chr*_*ons 2 bash sed id3

我正在尝试编写一个脚本来自动将曲目和标题信息添加到 mp3 文件的 id3 标签。

在这一点上,我已经 sed 从文件名中获取信息并将其格式化以适合 id3v2 命令,但是在点击多字标题时,我收到错误Couldn't stat file '<second word of title>'. 如果我只是回显正在运行的 id3v2 命令,我会看到以下格式的命令:

id3v2 -t Title\ Of\ Track -T 1 1_-_Title_Of_Track.mp3
Run Code Online (Sandbox Code Playgroud)

将该文本复制/粘贴到终端中可以正确执行标记,但当然缺乏预期的脚本自动化。所以这里是打算自动化这个过程的脚本的样子:

#!/bin/bash

for track in *.mp3 ; do
    id3v2 $(echo ${track} | sed -e 's/^\([1-9][0-9]*\)_-_\(.*\).mp3/-t \2 -T \1/' -e 's/_/\\ /g') ${track}
done
Run Code Online (Sandbox Code Playgroud)

关于为什么在手动键入时将标题视为单个参数而不是在编写脚本时将其视为单个参数的任何见解?

Chr*_*ons 7

根据 Valentin B 和 mueh 的评论,我放弃sed了脚本中的解析,而是使用了 bash 的字符串操作。虽然sed有利于解析多个数据并在单个命令中对其进行排序,但使用结果的命令扩展会将输出拆分为“单词”,即使空格前面有反斜杠或引号.

因此,而不是试图所有的参数来构建id3v2在单次使用sed,它被分解成分析出的曲目编号和名称分别使用bash的字符串操作。最终结果:

for track in *.mp3 ; do
    track_num=${track%_-_*}
    title=${track#*_} ; title=${title%.mp3} ; title=${title//_/ }
    id3v2 -t "${title}" -T ${track_num} ${track}
done
Run Code Online (Sandbox Code Playgroud)

感谢 mueh 准确地解释了为什么我在问题中的方法不起作用,以及 Valentin B 介绍了 bash 的字符串操作。