Regular-Expression

是否可以在多個 mp3 文件的標題標籤中搜尋一個字元串並將其替換為另一個字元串?

  • September 20, 2020

我想

  1. 搜尋“ytversion”,
  2. 將其替換為“mqversion”
  3. 在標題標籤中

多個 mp3 文件。我希望這個過程不要編輯/刪除元數據內容的任何其他部分。

這可能嗎?如果是,我必須使用哪些工具?

  1. 我知道我可以在多個 mp3 文件的元數據中搜尋某個字元串。這在 EasyTag 中是可能的。
  2. 但是,如何用預定義元數據欄位(上例中的標題欄位)的另一個字元串替換該特定字元串?

我不需要使用 EasyTag,它只是我在某個時候安裝的。

我想我的問題的答案依賴於我肯定可以使用的正則表達式。只是我不知道任何能夠使用它們或實際實現它們的程序(無論是必須在 CLI 中使用還是具有 GUI)。

您可以使用該id3v2工具執行此操作,該工具應位於您的作業系統的儲存庫中(請注意,此解決方案假定 GNU grep,如果您正在執行 Linux,則為預設值):

## 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 正則表達式。正則表達式正在搜尋以Title0 或多個空格字元開頭的行,然後是:( ^Title\s*:) 或以 開頭TIT2,然後是):( ^TIT2\s*.*\)) 的行。匹配到該點的所有內容都將被\K. 然後它會搜尋最短的字元串 ( .*?),後跟 Artist:.( (?=Artist:);這稱為正向前瞻,它會匹配您要查找的字元串,而不會將其計入匹配項,因此它不會被grep) 列印。

引用自:https://unix.stackexchange.com/questions/610350