是否可以在多个 mp3 文件的标题标签中搜索一个字符串并将其替换为另一个字符串?

是否可以在多个 mp3 文件的标题标签中搜索一个字符串并将其替换为另一个字符串?

我想

  1. 搜索“yt版本”,

  2. 将其替换为“mqversion”

  3. 在标题标签中

多个 mp3 文件。我希望此过程不编辑/删除元数据内容的任何其他部分。

这可能吗?如果是,我必须使用哪些工具?

  1. 我知道我可以在多个 mp3 文件的元数据中搜索某个字符串。这在 EasyTag 中是可能的。

  2. 但是,如何用预定义元数据字段(上例中的标题字段)的另一个字符串替换该特定字符串?

我不需要使用 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) 不会打印它。

相关内容