我有一堆我已经下载的歌曲,我试图转换为 .mp3 并重命名。将 .m4a 文件转换为带有ffmpeg
的 mp3 后,它们都采用艺术家名称 - 歌曲名称.mp3的格式。我希望能够将歌曲名称和艺术家名称分成他们自己的变量,这样我就可以重命名文件并用歌曲名称和艺术家名称标记歌曲。
那么,我如何将变量分成两个变量,每个变量分别包含艺术家姓名和歌曲名称,其中两个信息在bash中用' - '分隔?
答案 0 :(得分:2)
可以用纯粹的bash来完成:
#!/bin/bash
name="Artist Name - Song Name.mp3"
songname="${name#*- }"
songnamewithoutextentions="${songname%.*}"
artistname="${name% -*}"
printf "%s\n%s\n%s\n" "$artistname" "$songname" "$songnamewithoutextentions"
输出:
Artist: Artist Name
Song: Song Name.mp3
Song name without extention: Song Name
说明:
"${name#*- }"
是-
中$name
第一次匹配后的字符串
"${name% -*}"
是-
中$name
的最后一场比赛(右起第一场比赛)之前的字符串
您可以从manual了解有关Bash参数扩展的更多信息。
答案 1 :(得分:2)
使用内置于bash
的正则表达式匹配:
regex='(.*) - (.*).mp3'
[[ $v =~ $regex ]]
artist=${BASH_REMATCH[1]}
song=${BASH_REMATCH[2]}
答案 2 :(得分:1)
v='Artist Name - Song Name.mp3'
v=${v%.mp3}
song=${v#* - }
artist=${v% - $song}
echo a=$artist, s=$song
这会产生输出:
a=Artist Name, s=Song Name
请注意,此方法(如下面的sed解决方案)始终将艺术家和歌曲分配到-
的第一次次。因此,如果名称是:
v='Artist Name - Song Name - 2nd Take.mp3'
然后,输出是:
a=Artist Name, s=Song Name - 2nd Take
此方法为POSIX,可在dash
和busybox
以及bash
下使用。
$ v='Artist Name - Song Name.mp3'
$ { read -r artist; read -r song; } < <(sed 's/.mp3$//; s/ - /\n/' <<<"$v")
$ echo a=$artist s=$song
a=Artist Name s=Song Name
这假定(1)第一次出现-
将艺术家姓名与歌曲名称分开,(2)文件名$v
只有行(没有换行符)。< / p>
我们可以通过使用NUL作为分隔符而不是换行符来克服第二个限制:
$ { read -r -d $'\0' artist; read -r -d $'\0' song; } < <(sed 's/.mp3$//; s/ - /\x00/' <<<"$v"); echo a=$artist s=$song
a=Artist Name s=Song Name
以下是艺术家和歌曲名称中包含换行符的示例:
$ v=$'Artist\nName - Song\nName.mp3'
$ { read -r -d $'\0' artist; read -r -d $'\0' song; } < <(sed 's/.mp3$//; s/ - /\x00/' <<<"$v"); echo "a=$artist"; echo "s=$song"
a=Artist
Name
s=Song
Name
sed命令删除.mp3
后缀,然后用换行符替换-
:
sed 's/.mp3$//; s/ - /\n/' <<<"$v"
sed命令的输出由两行组成。第一行有艺术家姓名,第二行有歌曲名称。然后由两个read
命令读取它们。