여러 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행의 일치하는 부분만 인쇄하고 -PPCRE 정규식을 활성화하도록 지시합니다. 정규 표현식은 로 시작하고 Title그 뒤에 0개 이상의 공백 문자가 온 다음 :( ^Title\s*:) 이 오는 줄을 검색하거나, 로 시작하고 TIT2그 뒤에 ):( ^TIT2\s*.*\)) 가 오는 줄을 검색합니다. 그러면 해당 시점까지 일치하는 모든 항목이 삭제됩니다 \K. 그런 다음 가장 짧은 문자열( .*?) 뒤에 Artist:.( 가 오는 것을 검색합니다. (?=Artist:)이를 호출합니다.긍정적 인 전망찾고 있는 문자열과 일치하지만 일치 항목에 포함되지 않으므로 grep)는 인쇄하지 않습니다.

관련 정보