部分文字列置換リストの簡素化[閉じる]

部分文字列置換リストの簡素化[閉じる]

私は音楽を再生するスクリプトを書いた。ところでファイル名がおかしいですね。

このファイル名文字列があるとします。

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  

関連情報