![部分文字列置換リストの簡素化[閉じる]](https://linux33.com/image/124870/%E9%83%A8%E5%88%86%E6%96%87%E5%AD%97%E5%88%97%E7%BD%AE%E6%8F%9B%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E7%B0%A1%E7%B4%A0%E5%8C%96%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
私は音楽を再生するスクリプトを書いた。ところでファイル名がおかしいですね。
このファイル名文字列があるとします。
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