하위 문자열 대체 목록 단순화 [닫기]

하위 문자열 대체 목록 단순화 [닫기]

나는 음악을 재생하는 스크립트를 작성했습니다. 그런데 파일 이름이 이상하네요.

이 파일 이름 문자열이 있다고 가정해 보세요.

Muzzy__Break_Away__28feat._Priority_One_29__5BMonstercat_EP_Release_5D.mp3

나는 이 목표를 달성하고 싶다.

Muzzy Break Away feat Priority One

지금까지 나는 이것을 bash에 가지고 있습니다.

file="whatever";
file=${file//_/" "};
file=${file//[0123456789ABCDEF][0123456789ABCDEF]/""};  #replaces bytes
file=${file//.extension1/""};
file=${file//.extension2/""};
file=${file//.extensionn/""}; #many more, e.g. .mp3
file=${file//word1/""};
file=${file//word2/""};
file=${file//wordn/""}; #many more, e.g. Monstrcat
file=${file//./""};
echo "$file";

1개의 명령으로 동일한 순서(대소문자 구분)로 이를 단순화하는 방법이 있습니까?

답변1

Perl을 호출할 수도 있습니다:

formatted=$( perl -lpe '
        s/([0-9A-F]{2})/chr hex $1/eg;   # hex to ascii
        s/_+/ /g;                        # underscores to space
        s/\[[^]]*\]//g;                  # remove bracketed text
        s/[^[:alnum:][:blank:]]//g;      # remove non-alphanumeric,non-blank chars
    ' <<<"${file%.*}"
)
echo "$formatted"
Muzzy Break Away feat Priority One

답변2

이는 _28특정 문자의 16진수 인코딩처럼 보입니다. 어쩌면 다음과 같은 것을 원할 수도 있습니다( zsh대신 사용됨 bash):

$ autoload zmv
$ zmv -n '*.mp3' '${${f//(#b)_([0-9A-F](#c2))/${(#)$((0x$match))}}//_/ }'
mv -- Muzzy__Break_Away__28feat._Priority_One_29__5BMonstercat_EP_Release_5D.mp3 Muzzy\ \ Break\ Away\ \(feat.\ Priority\ One\)\ \[Monstercat\ EP\ Release\].mp3

이름 바꾸기에 중점을 둔 경우:

Muzzy__Break_Away__28feat._Priority_One_29__5BMonstercat_EP_Release_5D.mp3

도착하다

Muzzy  Break Away (feat. Priority One) [Monstercat EP Release].mp3

( -n만족스러우면 제거하세요(모의 실행의 경우)).

파일 이름이 있고 $file원하는 경우더 나은표시 표현의 경우 다음을 사용합니다.

set -o extendedglob # (that's on by default in zmv)
display=${${${file//(#b)_([0-9A-F](#c2))/${(#)$((0x$match))}}//_/ }:r}
  • (#b)역참조 활성화(따라서 $match[1]패턴에 캡처된 첫 번째 문자열이 대체됩니다)
  • ${(#)var}의 내용을 $var숫자로 해석하고 해당 코드 포인트가 있는 문자로 확장합니다.
  • $var:r$var에서 파일 이름의 루트 이름을 가져옵니다(확장자 제거).

답변3

이 작업을 수행하기 위해 bash 검색/대체를 사용해서는 안 됩니다. 파일에 ID3 메타데이터가 있는 경우 거기에서 해당 메타데이터를 읽고 선호하는 템플릿과 함께 사용해야 합니다.

$ id3v2 -l file.mp3

Title  : Computer Love                   Artist: Zapp                          
Album  : Golden Gems-80s                 Year: 2017, Genre: Pop (13)
Comment:                                 Track: 29
id3v2 tag info for 29-zapp-computer_love-f3b5b5db.mp3:
TRCK (Track number/Position in set): 29/29
TPE1 (Lead performer(s)/Soloist(s)): Zapp
TIT2 (Title/songname/content description): Computer Love
TCON (Content type): Pop (13)
TALB (Album/Movie/Show title): Golden Gems-80s
TYER (Year): 2017

그런 다음 awk/sed/cut/grep과 같은 도구를 사용하여 다음과 같은 변수에 정보를 저장할 수 있습니다.

Artist=$(id3v2 -l file.mp3 | grep "TPE"  | awk -F: '{print $2}')
Title=$( id3v2 -l file.mp3 | grep "TIT2" | awk -F: '{print $2}')

mv file.mp3 "${Artist} - ${Title}.mp3"

하지만 다음과 같은 도구를 사용하는 것이 좋습니다.MP3 태그/뮤직 브레인 피커드음악 파일을 관리하기 위해 실시간 미리보기를 제공하고 실수할 경우 롤백할 수 있습니다.

답변4

sed다음 명령을 사용하여 원하는 출력을 얻었습니다 .

echo "Muzzy__Break_Away__28feat._Priority_One_29__5BMonstercat_EP_Release_5D.mp3" \
  | sed "s/_[0-9]\{2\}_.*//g" | sed "s/[_0-9\.]/ /g"| sed -r "s/\s+/ /g"  

산출

Muzzy Break Away feat Priority One  

관련 정보