我想
搜索“yt版本”,
将其替换为“mqversion”
在标题标签中
多个 mp3 文件。我希望此过程不编辑/删除元数据内容的任何其他部分。
这可能吗?如果是,我必须使用哪些工具?
我知道我可以在多个 mp3 文件的元数据中搜索某个字符串。这在 EasyTag 中是可能的。
但是,如何用预定义元数据字段(上例中的标题字段)的另一个字符串替换该特定字符串?
我不需要使用 EasyTag,它只是我在某个时候安装的。
我想我的问题的答案依赖于正则表达式,我肯定可以使用它。只是我不知道有任何程序(无论是必须在 CLI 中使用还是具有 GUI)能够使用它们或实际实现它们。
答案1
您可以使用该id3v2
工具来执行此操作,该工具应该位于您操作系统的存储库中(请注意,此解决方案假定 GNU grep
,如果您运行的是 Linux,则默认为 GNU ):
## Iterate over all file/dir names ending in mp3
for file in /path/to/dir/with/mp3/files/*mp3; do
## read the title and save in the variable $title
title=$(id3v2 -l "$file" | grep -oP '^(Title\s*|TIT2\s*.*\)):\K(.*?)(?=Artist:)');
## check if this title matches ytversion
if [[ "$title" =~ "ytversion" ]]; then
## If it does, replace ytversion with mqversion and
## save in the new variable $newTitle
newTitle=$(sed 's/ytversion/mqversion/g' <<<"$title")
## Set the tite tag for this file to the value in $newTitle
id3v2 -t "$newTitle" "$file"
fi
done
这有点复杂,因为该id3v2
工具将标题和艺术家打印在同一行上:
$ id3v2 -l foo.mp3
id3v1 tag info for foo.mp3:
Title : : title with mqversion string Artist:
Album : Year: , Genre: Unknown (255)
Comment: Track: 0
id3v2 tag info for foo.mp3:
TENC (Encoded by): iTunes v7.0
TIT2 (Title/songname/content description): : title with mqversion string
该-o
标志指示grep
仅打印行的匹配部分,并-P
启用 PCRE 正则表达式。正则表达式正在搜索以 开头,Title
后跟 0 个或多个空白字符,然后是:
( ^Title\s*:
) 的行,或者搜索以 开头TIT2
,然后有):
( ^TIT2\s*.*\)
) 的行。然后,到该点匹配的所有内容都会被 丢弃\K
。然后它会搜索最短的字符串 ( .*?
) 后跟Artist:
.( (?=Artist:)
;这称为积极的前瞻并匹配您正在查找的字符串,但不将其计入匹配中,因此grep
) 不会打印它。